這是我的代碼,這是主漏洞嗎?
class MyClass
{
...
};
int main(){
MyClass class = new MyClass;
/*if i do this,
delete class;
i receive a seg fault*/
return 0;
}
這是一個MEM泄漏嗎?如果是的,我該如何解決?
在此先感謝
這是我的代碼,這是主漏洞嗎?
class MyClass
{
...
};
int main(){
MyClass class = new MyClass;
/*if i do this,
delete class;
i receive a seg fault*/
return 0;
}
這是一個MEM泄漏嗎?如果是的,我該如何解決?
在此先感謝
,因爲你使用的class
關鍵字作爲變量,甚至不會編譯,這樣你就不會得到一個段錯誤。
如果你修復了這個問題(可能還有其他幾個我認爲存在但不能被查找困擾的問題),除非你的構造函數或析構函數存在嚴重問題,否則我不會期望它出現段錯誤。
讓你的代碼先編譯,然後我們可以理清任何邏輯錯誤。
除此之外類不能被用作變量名這樣的事實,在C++中的新的運營商將返回一個指向類型MyClass的的對象。該statment應該是:
MyClass *objectPtr = new MyClass;
如果再無法刪除它,它仍然會在內存中存在,直到程序完成,因此算作泄漏(大概)。
沒有看到那一個有意思 - 很好的捕捉。 – paxdiablo
假設你得到的變量名稱權,並使其成爲MyClass *
,是的,這是一個內存泄漏。因爲您通過致電new
獲得了記憶,但您並未回憶記憶。
的解決方案是delete
指針,當你使用它來完成。
因此,例如:
MyClass *c = new MyClass;
...
delete c;
需要注意的是,如果你有new
編一個數組,你需要釋放它:
MyClass *c_arr = new MyClass[10];
...
delete[] c_arr;
要回答這個問題,是的,它是。新的分配而不刪除是內存泄漏。但具有諷刺意味的是,內存泄漏是這段代碼中最爲棘手的問題,因爲程序在「泄漏」時就終止了,所以它不會有問題。
我假定這是「僞碼」,所以我不會指出編譯錯誤。但是,避免使用僞代碼會很有幫助,因爲它不允許人們看到您不會包含在代碼片段中的問題。
如果delete
導致段錯誤,我認爲這是你真正的問題,那麼你的問題可能是一個除了內存泄漏之外的其他東西。內存泄漏通常不會導致立即的段錯誤,它們必須先耗盡可用的內存池。如果這是你的問題,那麼包含MyClass使用的代碼可能會有幫助,特別是對於析構函數。
這可能是堆棧損壞,但由於它在析構函數上崩潰,他認爲它與析構函數有關。 – tenfour