2012-09-01 32 views

回答

1

是它,是的,你做......

+2

這是未定義的行爲,它不是內存泄漏。 – john

4

是的,你必須使用:

delete[] pData; 

注意以下幾點:WRT動態分配:

  1. 儘量避免動態分配
  2. Yo ü需要使用delete[]如果您分配使用new[]
  3. 您需要使用delete如果您分配使用new
  4. 您需要使用free()如果使用malloc()
  5. 分配的內存,您需要通過同一個地址的內存記憶在所有上述3 [注]中由分配功能返回的釋放功能。

[注]
作爲正確在他的評論例子指出了大衛,一個例外是多重繼承,其中基類指針可能不具有相同的地址作爲子類,並通過基部類指針地址爲delete而不是子類指針地址仍然可以正常工作。

+0

對於分配有new []和malloc()的內存,點#5是正確的。對於用'new'分配的內存,'delete'的參數可以是一個指向分配有'new'的內存的基類的指針。該基類指針可能指向或不指向與'new'返回的內存位置相同的內存位置。 –

+0

@DavidHammen:這是不正確的。發送到任何類型的解除分配函數的地址必須與相應的分配函數返回的地址相同,否則您得到的是未定義的行爲。 –

+0

指向某個對象的指針和指向該對象的基類指針必然具有相同的地址(例如,多重繼承)。根據第5.3.5節第2段的規定:「在第一種替代方法(刪除對象)中,刪除操作數的值可能是空指針值,指向由前一個新表達式創建的非數組對象**或者指向代表這樣一個對象**的基類的子對象的指針。「從基類指針刪除是可以的,無論是新舊版本的標準。 –

13

如果您不使用delete[] pData,則行爲未定義。可能導致內存泄漏,可能導致程序崩潰,直到您爲最重要的客戶演示您的程序爲止。

+1

+1實際上是正確的。 – Fanael

7

這段代碼是否會產生內存泄漏?

不,它有未定義的行爲,這是更糟糕的。

我必須使用:delete[] pData;

是,與new[]分配的所有內存必須與delete[]釋放。但是,如果提前返回或異常阻止程序到達刪除表達式,它仍會產生內存泄漏。

除非你正在做一些不尋常的事情,否則很少有任何需要明確管理內存。在這種情況下,標準庫提供了一個方便動態數組類型:

#include <vector> 

std::vector<int> data(nWidth); 
// Do something here. 
// Memory is freed automatically when data goes out of scope.