2009-10-08 82 views
1

我知道,你必須做這樣的:動態分配的數組如何在C++中被釋放?

int * p; 
p = new int[10]; 

//use array 

delete [] p; 

現在我的問題是:因爲它沒有明確說明,它怎麼可能是正確的內存量被釋放?操作系統是否跟蹤分配的內存和它的起始地址?

+1

重複:http://stackoverflow.com/questions/197675/how-does-delete-know-the-size-of-the-operand-array – 2009-10-08 21:47:05

回答

2

運行時庫將跟蹤分配的內存塊。在給定初始指針new的情況下,保證正確釋放塊。

雖然這可以在操作系統本身(理論上)實現,它通常不是。操作系統跟蹤的是分配給整個流程的頁面,而不是在這個抽象層次上分配的單個塊。

5

是的,操作系統(或更可能是圖書館)保持跟蹤。

當您分配內存時,操作系統會爲您的內存創建一個小標題,這通常在分配的內存之前 - 也就是稍微低一點的地址。

當釋放內存時,它將指針釋放,返回幾個字節,然後檢查描述實際分配的結構,包括分配的大小。

+0

這是一種方法來做到這一點。 – 2009-10-08 21:54:18

1

它完全取決於實施。就像普通的malloc()/ free()一樣,系統必須保存一些額外的信息,正如你所提到的。一般來說,對malloc()或new運算符的調用會在它返回給你的指針之前在內存中設置一個頭結構,以便稍後當free()或delete運算符被調用時,它可以計算出怎麼了與你交給你的記憶塊。

0

它取決於實現,但我認爲運行時庫使用某種內存分配表來跟蹤分配的塊。