當我們在使用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...