2013-05-08 22 views
3
string * str=new string; 
delete str; 

當我刪除指向一個對象的'str'時,做兩個析構函數被調用 - 一個用於指針本身,另一個用於它指向的對象?在C++中是否有一個析構函數?

指針的析構函數會做什麼?

+2

我不明白這個問題。請儘量寫出適當和完整的英語句子,即使它不是你的母語(這對我也不適用) - 這個問題現在沒有任何意義。 – 2013-05-08 09:15:04

+2

我猜英語不是你的第一語言,但恐怕真的不清楚你實際問到的是什麼。我會編輯你的問題,以澄清我認爲你的意思(否則我認爲你的問題會很快關閉),但隨時回滾或改變它,如果它不符合你的意圖。 – Vicky 2013-05-08 09:15:44

回答

14

delete只是使給定指針在被破壞指向(在這種情況下,目的,string對象。指針本身,通過str表示時,具有自動存儲的持續時間,當它超出範圍將被銷燬像任何其他本地變量。

但是請注意,非類類型沒有析構函數。所以,即使您使用delete與非類的類型,沒有調用析構函數,但的指針超出範圍,它會像通常發生的任何其他自動變量一樣被破壞(意味着指針剛剛達到其結尾fetime,雖然指針指向的內存不會被釋放,但要使用delete明確釋放它,請使用直到)。

+0

非類型的「析構函數」通常通過移動堆棧指針來實現。對於具有自動存儲的類類型對象,在析構函數中發生不平凡的事情之後,也會發生這種情況。 – rubenvb 2013-05-08 09:34:19

+2

@rubenvb移動堆棧指針與破壞無關。通常通過更改堆棧指針來分配和釋放局部變量的存儲空間。它通常也在函數的開始和結束時完成,而不是在標準實際需要時(在「asf」規則下)。 – 2013-05-08 11:01:06

+0

@詹姆斯我不想說任何這樣的事情。我的意思是你在說什麼。但是我很確定類類型的* raw *內存(de)分配也是通過移動堆棧指針來完成的。在原始分配和解除分配之間是構造函數和析構函數的非平凡代碼被執行的地方。 – rubenvb 2013-05-08 11:19:49

3

析構函數的概念僅適用於對象(即用classstruct定義的實體),而不適用於普通類型,就像指針一樣。一個指針就像一個int變量一樣。

+0

C++中的「對象」(嚴格意義上來說)是一個記憶區域。我認爲你的意思是班級類型。 – rubenvb 2013-05-08 18:52:54

+0

@rubenvb感謝您的評論,編輯。 – 2013-05-08 19:28:02

4

它自己的指針沒有被delete語句破壞。但作爲範圍變量,它在範圍結束時被銷燬。

例子:

void Function() 
{ 
    string * str=new string; 
    delete str; // <-- here the string is destructed 
} // <-- here the pointer is "destructed", which is mean it's memory freed from the stuck but no actual destruction function is called.. 
0

當我刪除「STR」,它指向的對象,做了兩分析構函數被調用 - 一個用於指針本身,另一個用於其指向的對象?

No. delete需要一個指針參數。它銷燬指向的對象(使用它的析構函數,如果它有一個,並且不做任何事情),並釋放指向的內存。您以前必須使用new來分配內存並在那裏創建對象。

指針本身不受影響;但它不再指向一個有效的對象,所以你不能對它做任何事情。這有時被稱爲「懸掛指針」。

指針的析構函數會做什麼?

什麼都沒有。只有類類型具有析構函數。

0

我喜歡從每種類型都有析構函數的概念中獲得的簡化。這樣,你不會有明確破壞儲值模板的心理干擾,即使存儲的值的類型是int或指針:

template <class T> struct wrapper { 
    unsigned char data[sizeof(T)]; 
    wrapper(T t) { ptr = new (data) T; } 
    ~wrapper() { (T*)&data->~T(); } // ignore possible alignment problem 

wrapper<int> i(3); 

然而,int S中的析構函數和指針是非常微不足道的:它們什麼都不做,並且沒有地方可以去查看析構函數的定義,因爲定義不存在。所以說它們沒有析構函數也是合理的。

無論哪種方式,當指針超出範圍時,它就會消失;沒有特殊的代碼運行。

0

的原始指針的析構函數,比如你的std::string*例子,是微不足道的(就像析構函數等基本類型:intdouble等)

智能指針類具有非平凡的析構函數做像免費資源的東西,調整參考計數等。