2010-12-04 33 views
4

如果我在類中有一個字符串,則分配內存。我是否必須銷燬析構函數中的字符串?例如我是否需要銷燬C++中的字符串

 
class A { 
    string Test; 
    A() { 
    Test = "hello world"; 
    } 

    A(string &name) { 
    Test = name; 
    } 

    ~A() { 
    // do I have to destroy the string here? 
    } 
} 

我是一個老的C/C++(預STL)編程並取回C++中。該字符串是否使用模板魔法自動銷燬?

TIA, 戴夫

+1

在你的例子中,`string`解析爲`:: std :: string`? – SingleNegationElimination 2010-12-04 01:11:08

+0

有趣的事情(對我來說)在於析構函數。 C++是否保證在父對象的構造函數被調用後成員對象被破壞?我能以某種方式防止這種情況發生嗎? (只是出於好奇;也許你可以引用C++標準的相關部分。) – 2010-12-04 01:19:29

+0

C++保證你的類成員將按照它們被構造的相反順序(這是它們被聲明的順序)被銷燬。比C++標準更可讀的解釋:http://msdn.microsoft.com/en-us/library/8183zf3x(VS.80).aspx – cgmb 2010-12-04 01:47:03

回答

5

是。字符串和容器爲你分配/釋放。但是,指針的容器並不能釋放這些指針指向的內容。你必須自己循環。

2

否。字符串的析構函數將在A的實例超出作用域時被調用。

2

你並沒有創建一個指向字符串的指針,所以Test將被分配到堆棧上(假設對象A被分配到堆棧上)。因此,當它離開作用域時,它將被自動釋放。如果Test是一個指針,它將被分配到堆上,並且你需要在析構函數中刪除它

0

你清理你的混亂,標準庫清理它的混亂。 std :: string分配的內存是亂七八糟的。

析構函數的默認行爲是調用每個基類和數據成員上的析構函數。你的字符串是一個數據成員,所以它的析構函數被調用。它的析構函數完成了所有需要在這裏完成的工作,所以在這裏清理任何東西比在main()中將字符串作爲局部變量沒有更多的需要(事實上它會是非常錯誤的)。

相關問題