深度探索C 物件模型筆記 第六章

2021-09-27 04:36:41 字數 896 閱讀 3760

c++程式中所有的global objects都被放置在程式的data segment,如果顯示指定給它乙個值,此object將以該值為初值,否則object所配置到的記憶體內容為0

語言要求每次呼叫new都傳回乙個獨一無二的指標,所以如果size等於0返回乙個1-byte的記憶體區塊

point *ptr=

newpoint3d[10

];//完全不是個好主意

如果我們配置乙個陣列,內含1個point3d objects,我們會預期point 和point3d的建構函式被呼叫10次,每次作用於陣列中的乙個元素

而當我們delete由ptr所指向的10個point3d元素時,

delete

ptr;

//只有point::~point 被呼叫

施行於陣列上的析構函式,是根據交給vec_delete()函式的「被刪除之指標型別的析構函式」——本例中正是point 析構函式。不止執行錯誤的析構函式,而且自從第乙個元素之後,該析構函式即被施行於不正確的記憶體區塊中(因為元素的大小不對)

最好就是避免以乙個base class指標指向乙個derived class objects所組成的陣列,如果一定要這樣寫程式,可以這麼寫:

for

(int i=

0;i)

一般而言,placement new operator並不支援多型,被交給new的指標,應該適當指向一塊預先配置好的記憶體。如果derived class比base class大,例如
point2w *p2w=

new(arena) point3d;

point3d的constructor將會導致嚴重的破壞

臨時物件被摧毀,應該時對完整表示式求值過程中的最後乙個步驟

《深度探索C 物件模型》第六章 執行期語意學

new運算子和delete運算子 運算子new看似是乙個簡單的運算,比如 int pi new int 5 但是它實際由兩個步驟完成 1.通過適當的new運算子函式實體,配置所需的記憶體 呼叫函式庫中的new運算子 int pi new sizeof int 2.給配置得到的物件分配初值 pi 5 ...

第六章筆記

頂層const與底層const的區別 頂層const是指標物件本身是乙個常量,而底層const是指標所指的物件是乙個常量,理解起來就相當於前者是直接,後者是間接。宣告函式可以多次,但是每個形參只能用實參預設初始化一次,即後續宣告只可以為未預設初始化的形參新增預設實參,而且其形參右側的所有形參必須都有...

深入探索C 物件模型 第六章 執行語義學

1.乙個區段可能有多個return離開點,所以可能導致一些物件建立後,沒有用就需要釋放,這就造成了很多浪費。所以建議把object放置在使用它的區段的附近。2.c 中全域性變數會放置在datasegment,如果沒有被指定值,內建型別其所被配置的記憶體內容將會被置為0。會被初始化 而區域性變數則不會...