作為乙個c++初學者,只是簡單的認為new就是新建乙個物件,delete就是刪除乙個物件。而在面對下面乙個問題時,就感覺有些困惑,new和delete到底做了什麼?
問題是:給定下面的類,為其實現乙個預設建構函式和必要的拷貝控制成員。
class treenode;
如果我們簡單的把當前結點刪了,那麼對於後面的節點我們就沒辦法刪除了。
(這裡我認為delete函式只是刪除掉指標所指物件,但是怎麼樣刪除的還不太了解。)
而如果要對每個左右結點呼叫delete,那我們不是要不斷判斷後續結點是否存在,然後一一刪除嗎?我的乙個想法是難道需要遞迴嗎?但是又如何遞迴呼叫delete呢?
等我查閱了一些相關資料,明白了new和delete的工作機理,才知道原來是這樣。
以下內容摘自c++ primer 第五版 726頁
當我們使用一條new表示式時:
//new表示式
string *sp = new string("a value"); //分配並初始化乙個string物件
string *arr = new string[10]; //分配10個預設初始化的string物件
實際上執行了三步操作:
1.new表示式呼叫乙個名為operator new (或者 operator new)的標準庫函式。該函式分配一塊足夠大的,原始的,未命名的記憶體空間以便儲存特定型別的物件(或物件的陣列)。
2.編譯器執行相應的建構函式以構造這些物件,並傳入初始值。
3.物件被分配了空間並構造完成,返回乙個指向該物件的指標。
當我們使用delete表示式刪除乙個動態分配的物件時:
delete sp; //銷毀*sp,然後釋放sp指向的記憶體空間
delete arr; //銷毀陣列中元素,然後釋放對應的記憶體空間
1.對sp所指物件或者arr所指的陣列中的元素執行對應的析構函式。
2.編譯器呼叫名為operator delete( 或者 operator delete )的標準庫函式釋放記憶體空間。
這裡可以明白乙個問題,當我們delete乙個類物件指標時會發生什麼。會呼叫類的析構函式。
如果類裡面還有該類的物件呢? 對該類的物件呼叫析構函式。不斷重複呼叫析構函式,直到全部都被析構。
這裡還有乙個小細節是值得注意的:當系統呼叫析構函式時,該物件並沒有被銷毀。
1.析構函式體自身並不直接銷毀成員。!!!!!
2.成員是在析構函式體之後(大括號後)隱含的析構階段中被銷毀的。
3.在整個物件銷毀過程中,析構函式體是作為成員銷毀步驟之外的另一部分而進行的。
所以,我們才能在析構函式體內訪問該物件的成員。
由此,我覺得析構函式的意義就在於保證物件的各種資料成員能夠正確的被銷毀,對應的記憶體空間能夠正確的被釋放。
深入new和delete小結
new和delete是c 中使用頻率非常高的兩個關鍵字,可以說c 記憶體操作的核心就在於這兩個關鍵字,近幾天閱讀了相關的文章,發現自己對於這兩個關鍵字的理解太過膚淺,因此做了一些個人總結。首先要明確一點,new和delete所操作的記憶體全部是在堆區,這個區域的記憶體和棧區是不一樣的,不會自動釋放,...
New和delete的原理
new和delete的原理 當我們在程式中寫下 new 和 delete 時,我們實際上呼叫的是 c 語言內建的 new operator 和 delete operator.所謂語言內建就是說我們不能更改其含義,它的功能總是一致的。以 new operator 為例,它總是先分配足夠的記憶體,而後...
多型與new和delete
在使用多型時,在new和delete時一定要保持原有物件型別,不能在new時就進行強制轉換,否則會在析構時出現問題。其他時候可以使用 如下面的例子 class cbase cbase virtual void call class cinherit public cbase cinherit vir...