2013-07-11 73 views
0

我有一個內存泄漏問題,(如果它很重要,他們是一類不知道)這是關係到一個類的內部結構的數組的數組的動態內存。當我在結構上調用delete時,內存不會被清除。當我使用與int和dbl完全相同的進程時,它可以正常工作,並按需要釋放內存。困惑刪除分配結構

我創建非常簡單的例子,他們能正確工作,它涉及到其他代碼的東西,但我不知道那會是什麼。我從來沒有得到任何錯誤,代碼正確執行。但是,分配/解除分配發生在一個循環中,因此內存使用率不斷上升。

換句話說,這裏的問題的總結:

struct myBogusStruct { 
    int bogusInt1, bogusInt2; 
}; 

class myBogusClass { 
    public: 
     myBogusStruct *bogusStruct; 
}; 

void main(void) { 

    int i, arraySize; 
    double *bogusDbl; 
    myBogusClass bogusClass; 

    // arraySize is read in from an input file 

    for(i=0;i<100;i++) { 
     bogusDbl = new double[arraySize]; 
     bogusClass.bogusStruct = new myBogusStruct[arraySize]; 

     // bunch of other code 

     delete [] bogusDbl; // this frees memory 
     delete [] bogusClass.bogusStruct; // this does not free memory 
    } 
} 

當我刪除的其他代碼的一羣,都刪除線正常工作。然而,當它在那裏時,第二條刪除線什麼也不做。再次,我從來沒有從代碼中得到任何錯誤,只是內存泄漏。另外,如果我用一個固定的數字替換arraySize如5000,那麼兩個刪除行都能正常工作。

我真的不知道從哪裏開始尋找 - 什麼可能導致刪除線不工作?

回答

1

對於您在for循環內分配或刪除myBogusDbl沒有任何理由,因爲arraySize在循環內部永遠不會更改。

也是一樣的myBogusClass.myBogusStruct。沒有理由分配/刪除它在所有的循環中:

myBogusDbl = new double[arraySize]; 
myBogusClass.myBogusStruct = new bogusStruct[arraySize]; 

for (i = 0; i < 100; i++) { 
    // bunch of other code 
} 

delete[] myBogusDbl; 
delete[] myBogusClass.myBogusStruct; 

你也應該考慮使用std::vector,而不是使用原始的內存分配。

現在到了可能的原因,爲什麼第二次在原代碼刪除什麼都不做:在刪除一個NULL指針呢,顧名思義,什麼都沒有。這是一個無操作。因此,爲了調試目的,在刪除它之前嘗試引入一個測試來查看它是否爲NULL,如果是,則中止()。 (但是我會使用調試器,因爲與編寫調試代碼相比,在那裏設置監視表達式要快得多)。

通常,我們需要看到「一堆其他代碼」。

+0

「一堆其他的代碼」可能是隨指針搞亂。一個好的開始是通過valgrind運行代碼。另外,使用std :: vector。 – DanielKO

+0

好的 - 我搞砸了這個例子。事實上,arraySize的確會改變。我在那裏列出的for循環實際上是一個將arraySize作爲參數的子程序,被稱爲一堆。我試圖簡化......我想我的主要困惑是爲什麼雙工程按預期工作,而結構沒有。關於弄亂指針 - 我當然看到了這種可能性,但看不到任何事情正在做。這會導致刪除操作員無法工作? –