2013-09-25 30 views
1

這是一個簡單的問題,我是一個初學者,但我只想確認這一點。如何替換一個動態數組而不會導致內存泄漏?

說我有一個類對象int * data,它指向一個5個整數的數組。假設我有一個函數可以用5個參數替換數據,如下所示。

void replaceData(int a, int b, int c, int d, int e){ 
    int * temp = new int[5]; 

    temp[0] = a; 
    temp[1] = b; 
    temp[2] = c; 
    temp[3] = d; 
    temp[4] = e; 

    data = temp;   
} 

我擔心這會導致內存泄漏,因爲如果數據已經有5個ints,他們仍然會在周圍浮動。爲了避免這種情況,我試圖改變它:

void replaceData(int a, int b, int c, int d, int e){ 
    int * temp = new int[5]; 

    temp[0] = a; 
    temp[1] = b; 
    temp[2] = c; 
    temp[3] = d; 
    temp[4] = e; 

    delete data;  //would this prevent a memory leak? 
    data = temp; 
    temp = 0;   
} 

非常感謝您的意見!

回答

1

差不多。

delete運算符用於指向單個對象的指針。你需要做delete[] data這個工作。在最後清零臨時指針並沒有什麼區別。

+0

謝謝!很有幫助。 – SemperCallide

0

如果代碼是delete[]而不是delete,那麼您的代碼將是正確的。如果大小硬編碼,使用動態分配的數組沒有意義(至少在這種情況下)。只需使用int temp[5];即可。

更好的是,只需使用矢量。然後這是一個簡單的電話std::swap

2

如果data的分配方式與您分配temp的方式相同,那麼您需要在修改指針之前首先釋放舊數組,否則您將發生內存泄漏。

請注意,如果您分配一個數組(new int[5]),那麼你必須釋放數組是這樣的:

delete[] data; 

此外,更好的做法是使用STL容器喜歡std::vector而不是手動分配陣列,所有內存管理是爲您處理的。