我有下面的代碼剪斷:下面的代碼片段中是否有內存泄漏?
int nWidth = 10;
int *pData = new int[nWidth];
//I do something here
//then I free memory by:
delete pData;
執行這個代碼剪斷產生內存泄漏?我一定要使用:
delete[] pData;
我有下面的代碼剪斷:下面的代碼片段中是否有內存泄漏?
int nWidth = 10;
int *pData = new int[nWidth];
//I do something here
//then I free memory by:
delete pData;
執行這個代碼剪斷產生內存泄漏?我一定要使用:
delete[] pData;
是的,你必須使用:
delete[] pData;
注意以下幾點:WRT動態分配:
delete[]
如果您分配使用new[]
delete
如果您分配使用new
free()
如果使用malloc()
[注]
作爲正確在他的評論例子指出了大衛,一個例外是多重繼承,其中基類指針可能不具有相同的地址作爲子類,並通過基部類指針地址爲delete
而不是子類指針地址仍然可以正常工作。
對於分配有new []和malloc()的內存,點#5是正確的。對於用'new'分配的內存,'delete'的參數可以是一個指向分配有'new'的內存的基類的指針。該基類指針可能指向或不指向與'new'返回的內存位置相同的內存位置。 –
@DavidHammen:這是不正確的。發送到任何類型的解除分配函數的地址必須與相應的分配函數返回的地址相同,否則您得到的是未定義的行爲。 –
指向某個對象的指針和指向該對象的基類指針必然具有相同的地址(例如,多重繼承)。根據第5.3.5節第2段的規定:「在第一種替代方法(刪除對象)中,刪除操作數的值可能是空指針值,指向由前一個新表達式創建的非數組對象**或者指向代表這樣一個對象**的基類的子對象的指針。「從基類指針刪除是可以的,無論是新舊版本的標準。 –
這段代碼是否會產生內存泄漏?
不,它有未定義的行爲,這是更糟糕的。
我必須使用:
delete[] pData;
是,與new[]
分配的所有內存必須與delete[]
釋放。但是,如果提前返回或異常阻止程序到達刪除表達式,它仍會產生內存泄漏。
除非你正在做一些不尋常的事情,否則很少有任何需要明確管理內存。在這種情況下,標準庫提供了一個方便動態數組類型:
#include <vector>
std::vector<int> data(nWidth);
// Do something here.
// Memory is freed automatically when data goes out of scope.
移動到'codereview'也許 – Valerij
不僅內存泄漏,但安全漏洞。 – ybungalobill