2015-10-18 45 views
0

我有一個簡單的類與字符串指針和大小整數。它的構造函數將大小設置爲0,並指向新字符串[0];當我嘗試用delete []破壞字符串*時,程序崩潰。C++數組的字符串析構函數

#include<string> 
using std::string; 
class Strarr { 
private: 
    string *items; 
    int size; 
public: 
    Strarr() { 
     items = new string[0]; 
     size = 0; 
    } 
    ~Strarr() { 
     delete[] items; 
    } 
}; 
int main() { 
    Strarr test; 
    test.~Strarr(); 
} 

有人能解釋一下這裏發生了什麼嗎?

+4

請告訴我們是誰教你的,你應該手動調用析構函數。然後我可以打電話給一個能「修復」事情的人。 –

+1

再次考慮這個循環,並記住'size'是'0'。如果'size'是你真實代碼中的其他東西,那麼當你嘗試'刪除'你沒有'new'的東西時,你有*未定義的行爲。 –

+0

你知道,我不會手動調用析構函數。我只是這樣做,以顯示發生了什麼。 – user2867253

回答

0

讓我告訴你一個程序中,我寫道: -

#include <iostream> 
using namespace std; 
class Some_Class 
{ 
    public: 
    Some_Class() 
    { 
     cout<<"constructing\n"; 
    } 
    ~Some_Class() 
    { 
     cout<<"destroying\n"; 
    } 
}; 
int main() 
{ 
    cout<<"executing...\n"; 
    Some_Class *p=new Some_Class[0]; 
    delete[] p; 
    cout<<"executed\n"; 
    return 0; 
} 
/* OUTPUT:- 
executing... 
executed 
*/ 

顯然,我的程序不會崩潰像你。您的問題可能與您手動撥打destructor有關。在這種情況下,它將刪除class object兩次,這是undefined behaviour。因此,如果您尚未分配對象dynamically(即new,因爲在這種情況下您必須撥打delete),請不要手動撥打destructor

+0

好吧,我想我明白了。問題不在於刪除字符串數組,而是刪除該對象。 – user2867253

+0

是的,如果你覺得這個答案令人滿意,那就把綠色的勾號放在它上面 –

0

問題是項目是指向單個字符串的指針,而您爲其分配了一個字符串數組並稍後刪除該數組。

我不確定你要做什麼。如果你正在嘗試構建一個字符串類,你可能需要一個指向字符數組的指針。如果你試圖構建一個字符串數組,爲什麼不使用一個字符串向量?

+0

我已經使用過vector,只是很好奇爲什麼這段代碼崩潰了。 :) – user2867253

+0

OP分配一個數組(不知道零長度究竟是什麼)並刪除一個數組,所以這不是問題。 –