2017-01-31 50 views
-2

首先,我沒有使用C++很多時間,這個問題很可能非常簡單,不值得在這裏發佈。無論如何,我在這裏或其他來源找不到任何解決方案。 我的問題在於以下。假設我們有A類:字符數組初始化和析構函數

Class A 
{ 
    char* string; 
public: 
    char*& getString(){ return string; } 
    ~A() 
    { 
     if (string) 
      delete[] string; 
    } 
}; 

我不能修改這個類(它僅僅是一個真正的類的樣品)。 我想設置現場string的值:

int main() 
{ 
    A a; 
    a.getString() = new char[3]; 
    a.getString() = "Hi\0"; 
    return 0; 
} 

此代碼原因調試斷言失敗時,析構函數~A()被調用。我在這裏做錯了什麼? 我真的很感激任何關於我做錯了什麼的建議。

編輯: 看來,這裏的賦值運算符是重要的。其實,我在做這樣的作業:

int main() 
{ 
    A a; 
    char name[256]; 
    std::cin.getline(name, 256); 

    a.getString() = new char[strlen(name)]; 
    //actual version 
    strcpy_s(a.getString(), strlen(name), name); 
    //a.getString() = "Hi\0"; 
    return 0; 
} 
+4

您試圖「刪除」一個靜態分配的字符串(所有字符串文字都是靜態分配的)。優先考慮std :: string並刪除你的析構函數(std :: string使用RAII,並且會自動處理它的資源)。 – Kevin

+0

基於當前值,賦值的行爲不同。它將始終分配新值並覆蓋舊值。 – chris

+4

你的代碼歸結爲'delete []「Hi」;'。你正試圖'刪除'沒有用'new'分配的指針。您也泄漏以前的分配。 –

回答

0

此代碼原因調試斷言失敗時,析構函數〜A()被調用。我在這裏做錯了什麼?

a.getString() = "Hi\0"; 

這條線之後,a.string指向一個字符串。然後析構函數會在指針上調用delete[]。刪除字符串文字具有未定義的行爲。另外,由於指針被覆蓋,所以先前分配的動態數組被泄漏。

解決方法是刪除引用的行。