目录
前提
new
问题:
结论:
解析:
delete
问题:
结论:
解析:
前提
class Data
{
public:Data(){cout<<__FUNCTION__<<endl;}~Data(){cout<<__FUNCTION__<<endl;}
private:int m_data;
};Data *p1 = (Data*)malloc(sizeof(Data));
Data *p2 = new Data;
new
问题:
- 用malloc会不会调用构造函数?--------- 不会
- 用new会不会调用构造函数?------------会
结论:
- new = malloc + 构造函数
解析:
在运行这句话的时候(Data *p1 = new Data;), 编译器在编译的时候,会将表达式new Data 转换成 new运算符函数调用 operator new(sizeof(Data))
现在我们重写new运算符函数
//new 运算符函数重载 在类中定义void* operator new(unsigned long long size){cout<<"new"<<endl;void* p = malloc(size);memset(p,0,size);return p;}
这个函数做了两件事情:
- 将表达式转换成 运算符函数调用,在函数里面申请堆空间,并清0
- 自动帮你执行构造函数(先运行重载函数再运行构造)
delete
问题:
- 用free会不会调用析构函数?--------- 不会
- 用delete会不会调用析构函数?------------会
结论:
- delete = free +析构函数
解析:
在运行这句话的时候(delete p1;),编译器在编译的时候,会将表达式 delete p1 转换成 运算符函数调用 operator delete(p1)
现在我们重写delete运算符函数
//delete 运算符函数重载void operator delete(void*p){cout<<"delete"<<endl;free(p);}
这个函数做了两件事情:
- 先执行析构函数
- 将表达式 delete p1 转换成 运算符函数调用 operator delete(p1),然后释放空间
总结
-
在重写new的时候要申请堆空间
- 在重写delete的时候要释放堆空间