2013-04-26 49 views
3

我被困在利用我的析構函數的 我簡短的代碼結構是這樣的:如何使用析構函數與非指針屬性

class test 
{ 
    private: 
    string code; 
    int digit, num_digit; 

    //destructor 
    ~test() 
    { 
     if(digit >= 0 && digit > num_digit) 
     { 
     for(unsigned int i=0; i<code.length(); i++) delete &code[i]; 
     } 
    } 
}; 

<more code> ............. 
<more code> ............. 

int main() 
{ 
     Test test1 
     test1.~test(); 
} 

我的核心也會被中止通過一部分的析構函數去時。 Unix編譯器說Aborted - 'core dumped' 有什麼想法嗎?

+2

你爲什麼要手動調用'test1。〜test();'?你永遠不應該那樣做! – 2013-04-26 08:39:14

+0

同樣在你的情況下,你的析構函數不僅是多餘的,而且會導致未定義的行爲 – 2013-04-26 08:40:42

+0

@AlexChamberlain實際上有一個罕見的例外,那就是當你使用placement new。 – 2013-04-26 08:42:41

回答

7

該中止發生,因爲正在企圖以delete做,這不是動態分配的對象:delete什麼經new創建(delete[]new[]code成員不是動態分配的。當包含對象被銷燬時它將被自動銷燬。在Test的情況下,沒有理由手動析構函數。

這是不正確的:

test1.~test(); 

不要顯式調用對象的析構函數。當test1超出範圍時,將自動調用析構函數。對於動態分配的對象,當析構函數爲delete時,它將被調用。

+0

實際上字符串代碼可以作爲char *代碼不是嗎? – user2282596 2013-04-26 08:37:54

+0

所以我把刪除和代碼[我]我做錯了嗎? – user2282596 2013-04-26 08:38:44

+1

@ user2282596,內部'std :: string'將會有一個動態分配的緩衝區,但是'std :: string'實例會自行處理它。 – hmjd 2013-04-26 08:38:45

3

您只能刪除使用新的調用創建的指針。

您正在刪除指向堆棧中字符串的指針。這給你核心轉儲。

+0

thx你的答案是有幫助的 – user2282596 2013-04-26 08:50:58