程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中的delete——讀書筆記

C++中的delete——讀書筆記

編輯:C++入門知識

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




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved