2011-09-16 88 views
-3

這是我的代碼,這是主漏洞嗎?

class MyClass 
{ 
... 
}; 

int main(){ 

MyClass class = new MyClass; 
/*if i do this, 
delete class; 
i receive a seg fault*/ 

return 0; 
} 

這是一個MEM泄漏嗎?如果是的,我該如何解決?

在此先感謝

回答

4

,因爲你使用的class關鍵字作爲變量,甚至不會編譯,這樣你就不會得到一個段錯誤。

如果你修復了這個問題(可能還有其他幾個我認爲存在但不能被查找困擾的問題),除非你的構造函數或析構函數存在嚴重問題,否則我不會期望它出現段錯誤。

讓你的代碼先編譯,然後我們可以理清任何邏輯錯誤。

+0

這可能是堆棧損壞,但由於它在析構函數上崩潰,他認爲它與析構函數有關。 – tenfour

2

除此之外類不能被用作變量名這樣的事實,在C++中的新的運營商將返回一個指向類型MyClass的的對象。該statment應該是:

MyClass *objectPtr = new MyClass; 

如果再無法刪除它,它仍然會在內存中存在,直到程序完成,因此算作泄漏(大概)。

+0

沒有看到那一個有意思 - 很好的捕捉。 – paxdiablo

0

假設你得到的變量名稱權,並使其成爲MyClass *,是的,這是一個內存泄漏。因爲您通過致電new獲得了記憶,但您並未回憶記憶。

的解決方案是delete指針,當你使用它來完成。

因此,例如:

MyClass *c = new MyClass; 
... 
delete c; 

需要注意的是,如果你有new編一個數組,你需要釋放它:

MyClass *c_arr = new MyClass[10]; 
... 
delete[] c_arr; 
0

要回答這個問題,是的,它是。新的分配而不刪除是內存泄漏。但具有諷刺意味的是,內存泄漏是這段代碼中最爲棘手的問題,因爲程序在「泄漏」時就終止了,所以它不會有問題。

我假定這是「僞碼」,所以我不會指出編譯錯誤。但是,避免使用僞代碼會很有幫助,因爲它不允許人們看到您不會包含在代碼片段中的問題。

如果delete導致段錯誤,我認爲這是你真正的問題,那麼你的問題可能是一個除了內存泄漏之外的其他東西。內存泄漏通常不會導致立即的段錯誤,它們必須先耗盡可用的內存池。如果這是你的問題,那麼包含MyClass使用的代碼可能會有幫助,特別是對於析構函數。