int *createInt()
{
int *a = new int;
return a;
}
int main()
{
int *x = createInt();
*x = 10;
cout << *x << '\n';
delete x; // do I need this?
return 0;
}
我需要洗掉 x 嗎?如果我不這樣做,會導致記憶體泄漏問題嗎?
uj5u.com熱心網友回復:
您似乎對指標和指向物件之間的區別感到困惑。 a并且x是指標。想象一張寫有聚會地址的紙。
int *a = new int;在堆上分配一個新物件并將地址分配給指標a。這就像在房子里開派對,然后在一張名為 . 的紙上寫下地址a。
return a;回傳指向呼叫者的指標。這就像把地址紙交給告訴你開始派對的人。
*x = 10;訪問物件,并修改它。這就像去紙上的地址,繞過愚蠢的帽子,你已經把它變成了一個化妝舞會。
delete x; // do I need this?是的,您需要洗掉您分配的物件。這表示“在本文中的地址結束聚會”。
其他問題:
what if I don't delete memory?然后聚會永遠繼續,沒有其他人可以再在那個地址聚會,因為第一個聚會還在繼續。
what if I delete the memory twice?兩次結束派對是沒有意義的。什么都可能發生。或者它可能會燒毀。或者可能每次都不一樣。
what if I use the pointer after deleting it?去參加一個已經結束的派對是沒有意義的。也許什么都不會發生。或者也許有人用軍事基地取代了房子,你擅自闖入并被捕。或者可能每次都不一樣。
what if I reassign the pointer without deleting?如果你擦掉那張紙并在上面寫一個新地址,那對聚會沒有任何影響。除了你可能再也找不到它了,而且派對永遠持續下去。
I was told that members of classes are destroyed when the class is destroyed. Does that delete the object?不,燒掉寫有地址的紙并不會結束聚會。
uj5u.com熱心網友回復:
這個說法
delete x;
不會洗掉指標 x 本身。它洗掉指標 x 指向的動態分配的記憶體
int *a = new int;
//...
int *x = createInt();
在此宣告之后
delete x;
指標 x 將是活動的,但將具有無效值。由于指標本身具有自動存盤持續時間,因此它將在定義它的塊范圍結束后自動銷毀。
您應該始終洗掉動態分配的記憶體以避免記憶體泄漏。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446152.html
上一篇:在C中取消參考NULL指標
