2009-08-13 70 views
3

我在想C++中的delete []操作符。 (我正在使用Visual Studio 2005)。刪除[]和內存泄漏

我有一個託管DLL正在調用的非託管DLL。當我在調試時執行幾個任務後關閉了這個程序時,我得到了很多(數千?)內存泄漏,大部分是24字節 - 大小爲44字節。我懷疑這可能是由於我有一個非託管DLL。

無論如何,從我的理解,如果我有以下代碼:

char* pointer = new char[500] 
/* some operations... */ 
delete[] pointer; 

然後,所有它的內存是否正確釋放了,對嗎?

時會發生什麼,我有以下代碼:

char* pointer = new char[500]; 
char* pointerIt = pointer; 
/* some code perhaps to iterate over the whole memory block, like so */ 
for (int i = 0; i < 250; i++){ // only iterate halfway 
    *pointerIt = 0; 
    pointerIt++; 
} 

delete[] pointer; 

內存指針指向被刪除嗎?所以這意味着指針現在不是指向有效的內存..但沒關係,因爲我可以將兩個指針設置爲NULL,對吧?

不管怎麼說,現在會發生什麼,如果我這樣做:

char* pointerFirstPosition = new char[500]; 
char* pointerIt = pointerFirstPosition; 

for (int i = 0; i < 250; i++){ // only iterate halfway 
    *pointerIt = 0; 
    pointerIt++; 
} 

delete[] pointerIt; // delete the pointer iterator... 

將這個代碼由pointerIt刪除內存塊指出,高達pointerIt +500?或者它會刪除pointerFirstPos指向pointerFirstPos +500的內存塊嗎?

這可能導致內存泄漏?

對不起,我試圖讓我的信息清晰。

感謝,

克雷布斯

+1

「但沒關係,因爲我可以設置兩個指針爲NULL,對吧?」那麼,你應該完成這些指針...... – GManNickG 2009-08-13 03:03:23

回答

4

第一個問題集:

char* pointer = new char[500] 
/* some operations... */ 
delete[] pointer; 

然後爲這一切的內存被釋放 正確的,對嗎?

沒錯。

第二個問題集:

char* pointer = new char[500]; 
char* pointerIt = pointer; 
/* some code perhaps to iterate over the whole memory block, like so */ 
for (int i = 0; i < 250; i++){ // only iterate halfway 
    *pointerIt = 0; 
    pointerIt++; 
} 

delete[] pointer; 

的內存指針指向的 刪除嗎?所以這意味着 指針它現在不是指向有效的 內存..但沒關係,因爲我可以 設置兩個指針爲NULL,對不對?

內存pointer擁有一個地址被完全刪除是的。 pointerpointerIt都包含無效內存的地址。每個指針只是一個變量,每個變量都是獨立的。所以兩個存儲彼此獨立的地址。解引用運算符*將簡單地給你在該地址的變量。該地址處的變量是與指針變量不同的變量。

第三個問題集:

你應該只刪除已分配,整個陣列的地址。如果您嘗試刪除部分數組,您將會遇到未定義的結果。它可能導致內存泄漏?可能會導致崩潰嗎?可能,它可能導致....?有可能。

所以只能刪除你分配的東西。如果你分配一個數組,那麼如果你刪除了一個非你使用delete刪除的數組的類型,則用delete[]刪除。

這裏是東西的eample是罰款只是爲了清晰:

char* pointer = new char[500]; 
char* pointerIt = pointer; 
//This is fine because you are deleting the same address: 
delete[] pointerIt; 
//The memory that both variables point to is freed, do not try to free again 
+2

除了使用'new'或'new []'創建的東西外,它沒有定義爲delete或者delete []'。 – GManNickG 2009-08-13 03:06:18

+0

謝謝,那是我懷疑的。但是說,例如在第三個問題集中,我設置pointerIt = pointerFirstPosition,然後刪除[] pointerIt,這仍然是未定義的?我正在與別人的舊代碼工作,他已經離開了公司,我試圖找出是否這是內存泄漏的原因。 – krebstar 2009-08-13 03:12:50

+0

只是爲了踢我測試了這在g ++ 4.4.1 - 基本上和你在第三個代碼示例中獲得的代碼相同,只是'pointerIt'在數組中移動了一半。在'pointerIt'上調用'delete []'會使'pointer'失效,但是如果行爲未定義,那麼顯然這種行爲不能期望來自每個編譯器。 – 2009-08-13 03:14:50

0

退房的boost :: shared_ptr的或升壓:: scoped_ptr的,從此再也不用擔心這一點。 這給你一個靜態的&引用計數的方式來管理你的記憶。

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm

+1

如果我這樣做,我將不得不修改這麼多的項目.. :(我的經理無法證明的東西 – krebstar 2009-08-13 03:22:15

+0

對於未來的代碼,然後使用'std :: vector'和kin。沒有手動內存分配* * ever **。 – GManNickG 2009-08-13 03:24:03

+0

好的,謝謝你們,非常有幫助:) – krebstar 2009-08-13 03:25:08