條款8:了解各種不同意義的new和delete
這裡講了3種new,分別是:new operator, operator new, placement new。
new operator最簡單,它就是我們平時常用的new關鍵字,需要注意的是,它是不能被過載的。new operator的語義是先分配記憶體,然後呼叫物件的建構函式。
operator new:這個是這三個new裡面唯一能夠過載的,平時我們過載的就是這個操作符。它的宣告是:
[cc lang=」cpp」]
void *operator new(size_t size);
[/cc]
但是operator new即使過載了,也只能負責分配記憶體,沒法完成new operator的後面那步:指定建構函式。
placement new:我們沒法直接在**中呼叫建構函式,placement new的作用,就是在給定的記憶體上構造物件。也就是完成了new operator的第二步。用的最多的可能就是在已經申請的共享記憶體上構造物件。
也就是說:new operator = operator new + placement new
摘錄下總結:「如果你希望將物件產生於heap,請使用new operator。它不但分配記憶體而且為該物件呼叫乙個constructor。如果你只是打算分配記憶體,請呼叫operator new,那就沒有任何constructor會被呼叫。如果你打算在heap objects產生時自己決定記憶體分配方式,請寫乙個自己的operator new。如果你打算在已分配(並擁有指標)的記憶體中構造物件,請使用placement new。」
delete沒有這麼複雜,只有兩個:delete operator和operator delete
看了前面的解釋,這個就簡單多了,delete operator是c++內建的不能修改,所做的事情,就是執行析構函式,並釋放記憶體。
operator delete是能夠過載的,一般會和operator new一起過載,以自定義記憶體的釋放方式。
delete operator = deconstructor + operator delete
用**來總結下前面提到的:
[cce lang=」cpp」]
#include
#include
class obj
~obj()
[/cce]
最後簡單說下陣列,c++分配陣列和刪除陣列,需要加乙個,這是因為執行類似string *p = new string[10];的時候,new operator會去呼叫operator new,刪除的時候必須使用delete p;同樣是因為,需要讓delete operator能夠正確的呼叫operator delete。
More Effective C 《基礎議題》
1 指標 指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元 而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如 int a 1 int p a int a 1 int b a 上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a...
More Effective C 擴充套件方法
c 3.0中增加了許多新特性.其中.擴充套件方法允許我們在不修改原有 的基礎上擴充套件類 介面的功能.有技巧的運用該特性.能寫出有效率 易維護 美觀的 c 2.0提供了許多泛型與容器的介面和類.最常見的如icomparable常常需要新建乙個comparable來進行排序比較等等.但其預設只有乙個c...
more effective C 條款四解讀
深刻考慮是否需要給類提供乙個預設建構函式 有一些類擁有乙個預設建構函式是合理的需求,比如string比如容器 linked list vector 預設建構函式可以把他們初始化為空容器。但是有一些類我們最好還是不要提供預設建構函式。比如乙個equipment類 class equipment 對於這...