C++中的delete——读书笔记

时间:2014.03.12

地点:基地

---------------------------------------------------------------------

一、单一对象内存释放

  为了避免内存泄露,每一个动态分配的对象都要执行相反的动作,比如:

string* ps;
...
delete ps;
编译器将产生这样的代码:它既能析构string对象又能释放该对象占用的内存,内存释放实际上是由operator delete执行的,通常声明如下:

void operator delete(void *memoryToBeDeallocated);
执行delete ps时会产生如下代码:

ps->~string();   //调用对象的析构函数
operator delete(ps);  //释放所占用的内存
所以如果你只打算使用原始的、未设初值的内存,应该回避new operator和delete operator,而改用operator new取得原始内存和operator delete归还原始内存。

void* buffer=operator new(50*sizeof(char));//分配足够内存,放置50个chars,但没有调用构造函数
......
operator delete(buffer);//释放内存,没有调用析构
这其实相当于C中的malloc和free

如果使用placement new,在某内存块中产生对象时应该避免对那块内存使用delete operator。因为delete opertor会调用operator delete来释放内存,但该内存含有的对象并非是operator new分配得来的。placement new只是返回它所接收的指针。因此为了抵消该对象构造函数的影响,应该直接调用该对象的析构函数。

---------------------------------------------------------------------

二、数组

  看例子:

string* ps=new string[10];
因为是数组,所以内存分配是operator new[ ]函数负责分配的。operator new[ ]和operator new一样,也可以被重载,夺得数组的内存分配权从而改变数组的内存分配方式。另外,数组版的new operator和单一对象版的第二个不同是:数组版new operator必须针对数组中的每个对象调用构造函数。因此,delete operator作用于数组时,它也会针对数组中的每个元素调用析构,然后再调用operator delete[ ]释放内存

delete [] ps;  //为数组中的每个对象调用string 析构,然后调用operator delete[ ]以释放内存
同样operator delete[ ] 也是可重载的。

---------------------------------------------------------------------

三、总结

 new operator和delete operator都是内建操作符,无法为你控制,但他们所调用的内存分配/释放函数则是可以的。通过重载operator new和operator delete你可以修改new对象和delete对象时完成任务的方式,但他们的任务是已经规定好了的,无法改变。




C++中的delete——读书笔记,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。