02 new與delete的工作

2021-10-04 13:13:13 字數 1266 閱讀 1601

當我們在使用new來建立物件的時候

complex* pc = new complex(1,2);
new 會先為物件分配一塊記憶體,接著呼叫建構函式。

try

catch(std::bad_alloc)

當我們在使用delete來釋放物件的時候

delete pc;
delete 會先呼叫析構函式,接著釋放記憶體

pc->~complex();

operator delete(pc); //operator delete()內部呼叫 free()

complex* pc = new complex[3];   //喚起3次ctor(建構函式)
delete pc;    //喚起3次dtor(析構函式)
如果釋放時忘記 [ ]

delete pc;    //喚起1次dtor(析構函式) => 造成記憶體洩露

從上圖中可看到,new在堆區開闢的空間不僅僅是整個資料的位元組大小,還在頭尾附帶了一些資料;

另外,對於非物件陣列(這裡是整型陣列),不存在析構函式,所以釋放的時候不用加上 [ ] 。

計算new開闢的空間大小:

debugger header(32) + no man land (4) = 36 bytes

標記大小"3"的位元組為 4 bytes

1個demo大小為 3*4 = 12 bytes,3個demo大小為 36 bytes

頭尾的"61h"大小為 4*2=8 bytes

整合 = 36 + 4 + 36 + 8 = 84 bytes

不滿足16倍數,所以要加上12bytes的pad

因此整個空間大小 = 84 + 12 = 96 bytes

new與delete的過載

include stdafx.h include using namespace std include include new 和delete的過載 new new delete delete 適用於極個別情況需要定製的時候才用的到。一般很少用 宣告可以不加 引數 void operator ne...

多型與new和delete

在使用多型時,在new和delete時一定要保持原有物件型別,不能在new時就進行強制轉換,否則會在析構時出現問題。其他時候可以使用 如下面的例子 class cbase cbase virtual void call class cinherit public cbase cinherit vir...

new與delete申請記憶體

malloc申請而來的只是記憶體,嚴格地說並不是 物件 new delete的引用就是要解決malloc帶來的問題 4個int,16個位元組 int p int malloc 16 for int i 0 i 4 i 在c 中,用new delete操作符取代malloc free 申請乙個物件 i...