时间: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对象时完成任务的方式,但他们的任务是已经规定好了的,无法改变。