簡體   English   中英

C ++中的內存分配和回收

[英]memory allocation and reclaim in C++

我是c ++的新手,只是閱讀了一些有關它的在線教程。 我對指針的實驗結果非常好奇。 這是我的代碼:

int *p_value;
sizeof(*p_value) <--- I expected 0 but it shows 4
p_value = new int;
sizeof(*p_value) <--- it shows 8, make sense
delete(p_value)
sizeof(*p_value) <--- I expect 0, but it shows 4 again...

更重要的是,我不理解為什么刪除操作后p_value指向相同的內存地址。 是否必須真實?


感謝您指出我對運算符“ sizeof”的誤解。 但是,在我的問題中,我沒有明確指出這一點。

這是另一個代碼:int * p_value = new int; cout << p_value <-打印新創建的int的地址,例如0x000A; 刪除p_value; cout << p_value <-它在“刪除”之前顯示相同的地址

我可以認為“刪除”只是將0x000A標記為未在Map中占用。 但這不會改變p_value的內容嗎?

您的結果可能不正確。 您的所有情況下的輸出size類型的intbytes (和sizeof(int)不能改變,由於運行的程序)。

我認為您缺少的關鍵是sizeof不是函數。 它不會像函數那樣在運行時查看其參數的 ,而只是在編譯時查看其類型

int *p_value;   
sizeof(*p_value) <--- I expected 0 but it shows 4

由於p_value是指向整數的指針,因此*p_value是整數。 整數是平台上的四個字節。

p_value = new int;   
sizeof(*p_value) <--- it shows 8, make sense

真奇怪 由於p_value是指向整數的指針,因此*p_value是整數。 因此,顯然,平台上的整數是8個字節。

delete(p_value)  
sizeof(*p_value) <--- I expect 0, but it shows 4 again...

你為什么期望0? 由於p_value是指向整數的指針,因此p_value是整數。 因此,它的大小為4(或平台上占用多個字節)。 p_value = malloc (sizeof (*p_value));將會如何p_value = malloc (sizeof (*p_value)); 工作?

更重要的是,我不理解為什么刪除操作后p_value指向相同的內存地址。 是否必須真實?

將變量的值傳遞給函數不會更改該變量的值。 因此delete (p_value)不會更改p_value的值,只是它現在指向垃圾。

上述sizeof(* ptr)返回的所有結果都為您提供了有關它指向的類型的大小的信息, 具體取決於您的平台 ,特別是int的大小,即4表示size:4個字節或32位,因此int最多可以容納2 32-1個符號位的不同數字。

您可以將返回的結果視為來自以下內容的結果: sizeof(int) ,無論您的int位置如何,*是否釋放動態分配的內存(是否delete不會改變,事實上,作為@ForEveR說,讓您的結果令人懷疑**。


*靜態,堆棧或堆內存。

**在兩個不同的平台上檢查,結果為4 ,而不是8

int *p_value;
sizeof(*p_value) <--- I expected 0 but it shows 4

*p_value是一個整數,大小通常為4個字節,因此顯示為4。這也取決於編譯器(C ++標准僅提及它應至少為4個字節)。 我的測試雖然返回8。

p_value = new int;
sizeof(*p_value) <--- it shows 8, make sense

如果上面顯示4,則該位置也應顯示4(除非您使用其他編譯器/目標架構)。 sizeof運算符顯示數據類型占用的字節數。 該值本身是不等價的。

delete(p_value)
sizeof(*p_value) <--- I expect 0, but it shows 4 again...

與上述相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM