关于C++里面的NEW/DELETE和maclloc/free。
昨天面试的时候被问到这个问题,如果new 一个对象,用free去释放,会有什么问题?
一时被问到这个陌生,于是就感觉来说,应该会报错。因为new与FREE不是配对的内存操作API。
后转念一想,delete也是清除分配的内存,free也是同样的功能,可能不会报错,再加上因为delete处理过程中比free多一步就是调用析构函数。所以说可能不报错,但没有对分配的对象作一些后续的析构清理动作。
今天就想写几行代码试下是否是这样。
先来看下在这段代码:
#include <iostream>
using namespace std;
class nf{
public:
nf();
~nf();
public:
int * get();
void set(int i);
private:
int * pi;
};
nf::nf()
{
cout<<"nf construction"<<endl;
pi = new int(0);
}
nf::~nf()
{
cout<<"nf destruction"<<endl;
delete pi;
}
int * nf::get()
{
return pi;
}
void nf::set(int i)
{
*pi = i;
}
int main(int argc,char ** argv)
{
nf * pnf = new nf();
pnf->set(100);
int * pp = pnf->get();
cout<<*pp<<endl;
delete pnf;
//free(pnf);
cout<<*pp<<endl;
return 0;
}
编译:
g++ -o m m.cpp
运行:
./m
结果:
[ter]$ ./m
nf construction
100
nf destruction
0
如上分析所同。
再来分析一下,如果用new创建对象,再用free去释放内存,结果会怎么样呢?
根据定义:new()函数实际过程中做了两步操作,第一步是分配内存空间,第二步是调用类的构造函数;delete()也同样是两步,第一步是调用类的析构函数,第二步才是释放内存;而malloc()和free()仅仅是分配内存与释放内存操作;
那么如果通过new分配的内存,再用free去释放,就会少一步调用析构函数的过程。同时,在构造函数里面申请的内存因为没有调用析构函数,所以该内存并没有释放,所以如果再输出该内存的值,那么应该还是原来设置的值100;
代码调用如下:
int main(int argc,char ** argv)
{
nf * pnf = new nf();
pnf->set(100);
int * pp = pnf->get();
cout<<*pp<<endl;
//delete pnf;
free(pnf);
cout<<*pp<<endl;
return 0;
}
经过上面的事情,还是说明那个同样的道理,不在乎你经历的事情的多少,而在乎你有没有对事情进行思考。不管碰到什么问题,都通过已有的基础知识的基本定义进行思考分析,就算是没有经历过,没有碰到过的事情,结果也是可能分析出来的。当然思考完了,后续如果有机会还是动手试验下比较好。