2017-07-17 231 views
1

如果我通過下面一行獲取一塊內存。C++中指針變量的內存釋放

int* a = new int[10]; 

然後釋放內存,該代碼將是

delete [] a; 

但是,如果我採取單個存儲器段的指針像下面

int* a = new int; 

然後插入的陣列數據如下。

for(int i=0;i<10;i++) 
{ 
    a[i]= i ; 
} 

所以以釋放所述第一存儲器區段指針「一」指向,代碼會像以下

delete a; 

但是在這裏,我插入從存儲器更多數據指針「a」指向。所以我在這裏實際使用了10個內存段。我怎樣才能釋放所有這10個內存?請幫我解答。

+4

這是未定義的行爲(你不能這樣做)。 – 2017-07-17 20:10:10

+0

但是在代碼塊中,我能夠從分配的單個內存開始插入數據的數組。 –

+3

@hasibuzzamanchowdhury不,你不是,只是因爲它看起來像它的作品並不意味着它不是未定義的。 –

回答

5

我該如何釋放所有這10個內存?

你不能和你不應該因爲一時你試圖「插入數據的陣列像下面」您已進入未定義行爲的土地用於寫入,你沒有與分配的位置首先是new。你問了一個單一的int,你有一個單一的int。不要寫過去。

1

您只分配了一個int。從a[1]a[9]的內存可能會分配給其他對象,並且可能會損壞它們。

P.S.順便說一句,你不能釋放你在任何情況下都沒有分配的內存。

+0

所以看起來,創建這樣的數組不是一個好主意? –

+1

@hasibuzzamanchowdhury正確。不是一個好主意。使用'std :: vector',如果您擔心可能會出現界限,請使用'at'方法而不是'[]'。 – user4581301

+0

當然。根據需要分配儘可能多的內存,不要寫入未分配的內存。 –

0

new int一個int值分配空間。你不能合法地假裝它是一個包含十個int值的數組,如果你超出範圍,編譯器將不會生成代碼來擴展分配的內存。你寫的代碼產生未定義的行爲。它編譯並運行的事實不會改變這一點;遲早會引起問題。

要分配一個可以保存10 int值的數組,請使用第一個表達式:new int[10]。這將爲十個int值分配空間。

要分配可以隨意擴展的數組,請使用std::vector<int>

+0

我得到了我的答案,非常感謝 –