假設你有一個簡單的類是這樣的:這是否被認爲是內存泄漏?
class foo{
private:
int* mData;
int mSize;
public:
foo(int size){
mSize = size;
mData = new int [mSize];
}
~foo() {
mSize = 0;
delete [] mData;
}
};
然後裏面主要你做:
int main() {
static int HUGE = 100000000;
foo a(HUGE);
// do something useful with a
// .
// .
// .
// Now I'm done with a; I do not need it anymore ...
foo b(HUGE);
// do something useful with b
// Ok we are done with b
return 0;
}
正如你看到的不再需要a
b
後,但由於它是在創建堆棧,析構函數將不會被調用,直到程序結束。現在,我知道這與new
分配並忘記撥打delete
不一樣,但這仍然在浪費記憶。你認爲這是「內存泄漏」還是隻是一個糟糕的編程?
另外,你會如何避免這種情況?
foo::~foo(){
if (mData != NULL){
delete [] mData;
mData = NULL;
mSize = 0;
}
}
另一種方式:一種方式是手動調用析構函數時,不再需要的對象,但是,除了面色難看又陌生!你,除非你改變析構像陷入的麻煩double free
通過foo *pa = new foo (HUGE)
在堆上創建a
,然後在不再需要對象時調用delete pa
。這有效,但有可能引入另一個可能的內存泄漏(如果忘記調用delete pa
)。
有沒有更好的方法擺脫不需要的對象?
我不認爲這是一個特別有建設性的問題。這一切都歸結於定義「內存泄漏」的含義。你清楚地知道發生了什麼,不管你稱之爲「內存泄漏」,「糟糕的編程」,還是其他什麼,都沒有太大的改變。噢,'std :: vector'確實能讓你的班級嘗試做什麼,但是做得對...... – 2012-04-03 16:54:41
「手動調用析構函數」。即使使用您的解決方法,也會調用未定義的行爲。一定不要在同一個對象上調用析構函數兩次。 – 2012-04-03 16:56:02
@Robᵩ請解釋爲什麼調用析構函數調用未定義的行爲? – GradGuy 2012-04-03 18:31:34