2012-04-06 31 views
-4

我分配了內存,但是當我調用析構函數時,它給了我一個分段錯誤。 這是代碼。我是否正確地使用內存?C++新建和刪除

class plan { 
    char *symbol; 
    gro *grow; 
    public: 
    plan (int, char[]); //constructor 
    ~plan (); //destructor 
}; 

plan::plan (int num_of_sm, char sm[]){ 
    try { 
    symbol = new char [strlen(sm) + 1]; 
    } 
    catch (std::bad_alloc) { 
    symbol = NULL; 
    } 


    if (symbol != NULL) { 
    if (sm == NULL) { 
     strcpy (symbol, ""); 
    } 
    else { 
     strcpy (symbol, sm); 
    } 
    } 
    gro = new grow [num_of_sm]; 
} 

plan::~plan(){ 
    delete [ ] symbol; 
    delete [ ] gro; 
} 
+4

很難說,因爲你還沒有顯示出你的班級的完整定義。請閱讀http://sscce.org。最可能的解釋是'symbol'不是一個有效的指針。 – 2012-04-06 23:24:31

+0

你的構造函數是什麼樣的? – 2012-04-06 23:24:52

+0

你如何以及在哪裏爲符號分配內存並增長? – Haatschii 2012-04-06 23:26:39

回答

5

使用std::string,並用它做。

只是萬一它不明顯,這將照顧到這個問題。

但同時,避免了一些類似的問題,去理解多一點所涉及的問題,不要擡頭的3規則,或因爲它是現在C++ 11的5

規則知
0

內存問題可能非常棘手,因爲程序並不總是立即崩潰。例如,如果刪除同一個指針兩次,程序可能會繼續正常工作,直到稍後刪除它崩潰的地方。如果你正在運行在Linux上我建議運行的valgrind(假設它的安裝只需要輸入的valgrind其次是正常的命令。例如valgrind myprog arg1 arg2

在任何情況下,不要以爲這個問題必須在程序崩潰。嘗試檢查任何其他刪除/免費聲明的問題。你也確定num_of_sm是一個合理的價值?

+0

是的它是合理的價值。我用printf來檢查,數字只有16。 – user1318393 2012-04-07 01:48:49

0

當我調用析構函數時,它給了我一個分段錯誤。

您是指測試代碼(波紋管)

int main() 
{ 
    plan a_plan(2, "hello"); 
    a_plan.~plan(); 
} 

如果是的話,我認爲這個問題是你刪除指針兩次。 第一次在plan ::〜plan(),第二次離開main()時。所以,不要打plan ::〜plan()。

如果你定義了析構函數,你應該遵循三條規則(或五條規則),也就是說: ,你應該同時定義拷貝構造函數和賦值運算符。