-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;
}
您試圖「刪除」一個靜態分配的字符串(所有字符串文字都是靜態分配的)。優先考慮std :: string並刪除你的析構函數(std :: string使用RAII,並且會自動處理它的資源)。 – Kevin
基於當前值,賦值的行爲不同。它將始終分配新值並覆蓋舊值。 – chris
你的代碼歸結爲'delete []「Hi」;'。你正試圖'刪除'沒有用'new'分配的指針。您也泄漏以前的分配。 –