兩個 cout 陳述句是否總是列印相同的值?
#include<bits/stdc .h>
using namespace std;
int main(){
int* p = new int();
*p = 54;
cout<<p; // it displays the address of int in heap();
delete(p);
p = new int[4];
cout<<p; // it displays the address of first block of memory, of array in heap;
return 0;
}
uj5u.com熱心網友回復:
兩個 cout 陳述句是否總是列印相同的值?
不。在delete(p)第一個運算式分配的記憶體new被釋放后,因此可以自由地重新用于以后對new運算式的評估,但完全不能保證它會是。
您正在重用相同的指標變數p是無關緊要的。它只是存盤新運算式回傳的存盤位置的地址。您可以使用不同的指標變數以相同的方式存盤地址。
int在第一個new運算式中創建 a 并在第二個運算式中創建 a 也無關緊要int[4]。兩個新運算式碰巧都回傳 a int*,它可以存盤在同一個變數中,但是如果您int在兩者中都簡單地使用,或者使用完全不同的型別和 type 的指標變數,則上述內容不會有任何改變void*。
uj5u.com熱心網友回復:
兩個 cout 陳述句是否總是列印相同的值?
不。 的目的delete是允許重用記憶體,因此下一次分配可能會回傳一個剛剛洗掉的值。
但未指定如何new管理記憶體。例如,我正在管理不同大小的池,因此要求空間 4 整數可能與 1 來自不同的池。
可能是在您的平臺上,這個簡單的程式總是會回傳相同的值兩次。但你應該認為這完全是偶然的,沒有什么用處。
uj5u.com熱心網友回復:
雖然在這種簡單的情況下,您可能會觀察到分配給的相同地址p,但通常情況并非如此。分配器將在第一次適合的基礎上分配一塊記憶體,在這種情況下,第一個具有必要大小的可用塊很可能與剛剛釋放的塊位于同一地址。
如果您要將示例更改為:
delete(p);
volatile int* dp = new int[4] ;
p = new int[4];
cout<<p;
您幾乎肯定會觀察到 的指標值p不再相同。此外,如果你有:
int* p1 = new int[4] ;
int* p = new int[4];
int* p2 = new int[4];
cout << p1;
cout << p2 ;
cout << p ;
delete[] p ;
p = new int[Ox8000];
cout << p;
堆很可能會被碎片化,以致第二次p分配不適合delete.
不會從存在中delete洗掉記憶體,而是將塊標記為可重用,將其回傳到堆中(并將其與相鄰的空閑記憶體合并)。當您獲得相同的指標值時,您觀察到的是簡單地重用回傳到堆的空間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515310.html
標籤:C 堆内存
上一篇:如何將鄰接矩陣轉換為關聯矩陣
下一篇:派生類訪問基類中的私有靜態成員
