時間: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對象時完成任務的方式,但他們的任務是已經規定好了的,無法改變。