new運算子和delete運算子
運算子new看似是乙個簡單的運算,比如:
int *pi=new
int(5);
但是它實際由兩個步驟完成:
1.通過適當的new運算子函式實體,配置所需的記憶體:
//呼叫函式庫中的new運算子
int *pi=__new(sizeof(int));
2.給配置得到的物件分配初值:
*pi=5;
(注意,上面的**中並不包括 exception handling,是為了方便理解,實際上應該進行檢測)
new運算子實際上總是以標準的c malloc()函式來完成的,雖然並沒有規定非要這麼做不可。相同的情況,delete運算子也總是以標準的c free()來完成的。
extern
void
operator
delete(void*ptr)
{ if(ptr)
free((char*)ptr);
}
placement operator new 語意
有乙個預先設定好的overloaded的new運算子,稱為placement operator new。它需要第二個引數,型別為void*,呼叫方式如下:
point2d *pt=new(area)point2d;
其中area指向記憶體中乙個區域塊,用以放置新的point2d物件,這個預先設定好的placement operator new 的實現方法非常簡單,只要獲得上面傳遞的void*指標所給出的位址(在獲取該位址的時候,要先將型別強轉為char*型別)。
point2d *pt=(point2d*)area;
if(pt!=
0) pt->point2d::point2d();
這正是使用placement operator new的威力強大之處,這乙份**將決定object被放置在**,編譯器保證object的constructor會施行在這個位址上。
但是有乙個缺點:如果該位址上面已經有乙個object,而且這個物件有destructor,這個destructor並不會被呼叫,呼叫該destructor的唯一方法就是將那個指標delete掉。
delete pt;
pt=new(area)point2d;
delete會發揮作用,但是它也會釋放該記憶體,這不是我所想要看到的,因為下乙個指令我們就要呼叫pt,因此我們應該明確的呼叫destructor,並且保留空間。
pt->~point2d;
pt=new(area)point2d;
後續的部分和第七章template語意學我準備先暫留著,過段時間重頭再讀一遍這本書。 深度探索C 物件模型筆記 第六章
c 程式中所有的global objects都被放置在程式的data segment,如果顯示指定給它乙個值,此object將以該值為初值,否則object所配置到的記憶體內容為0 語言要求每次呼叫new都傳回乙個獨一無二的指標,所以如果size等於0返回乙個1 byte的記憶體區塊 point p...
深入探索C 物件模型 第六章 執行語義學
1.乙個區段可能有多個return離開點,所以可能導致一些物件建立後,沒有用就需要釋放,這就造成了很多浪費。所以建議把object放置在使用它的區段的附近。2.c 中全域性變數會放置在datasegment,如果沒有被指定值,內建型別其所被配置的記憶體內容將會被置為0。會被初始化 而區域性變數則不會...
第六章(5)C C 執行期庫
c c 執行期庫 若要使多執行緒c和 c 程式能夠正確地執行,必須建立乙個資料結構,並將它與使用 c c 執行期庫函式的每個執行緒關聯起來。1 beginthreadex beginthreadex 函式的引數列表與 createthread 函式的引數列表是相同的,但是引數名和型別並不完全相同 c...