使用placement new裝載對象時的注意事項

1、對象可能被覆蓋。Placement new的工作機理是提供一個緩沖區(qū)來裝東西,這個東西可是任何東西,但是在這里我說的是對象。如果你沒有特別指定偏移量那么對象是從緩沖區(qū)的起始處開始存儲的。如果你有n個對象需要存儲并且也沒有指定偏移量,那么前n-1個對象會被第n個對象覆蓋,就算不覆蓋也會有區(qū)域重疊,而那個重疊區(qū)域最后的數(shù)據(jù)屬于第n個對象。所以你在同一個緩沖區(qū)存儲多個對象的時候一定要指定偏移量。例如下圖:

Pc3就加上了偏移量這樣第二個對象就不會覆蓋第一個對象了。

2、如果出現(xiàn)了覆蓋的情況,被覆蓋的對象將不會自動調(diào)用析構(gòu)函數(shù)。不調(diào)用析構(gòu)函數(shù)會怎樣?就會造成資源泄露唄!那么事實是否果真如此,讓我們做個實驗,如下圖所示:

這個base的源碼如下所示:

由上圖可知這個析構(gòu)函數(shù)如果正常工作的話會打印兩個~base

works語句,由此可見單單是把placement

new的緩沖區(qū)delete掉是不會自動調(diào)用析構(gòu)函數(shù)的。

那應(yīng)該如何解決這一問題?答案就是你顯式地調(diào)用它們的析構(gòu)函數(shù)。

如下圖所示:

結(jié)果如下所示:

這樣就能夠達到調(diào)用析構(gòu)函數(shù)的目的。

在這里我感覺應(yīng)該解決一個額外的問題,那就是地址0019A018-0019A010=8,那為什么p2-p1等于4而不是等于8呢?那是因為你所看到每一個十六進制數(shù)字都是由4bit組成的,所以它們之間加減運算也是以4bit為單位的,即它們相減的結(jié)果是8個4bit=32bit=4byte。所以簡化一下計算過程就是(p2-p1)*4/8=(p2-p1)/2就OK了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容