[英]C++: memory issue when I delete a pointer created by new
我對以下代碼有點困惑
int main()
{
int* a = new int{12};
int* b = new int;
b = a;
delete a;
delete b;
return 0;
}
代碼返回一個錯誤
a.out(27538,0x10ade7e00) malloc: *** error for object 0x7f8c18504160: pointer being freed was not allocated
a.out(27538,0x10ade7e00) malloc: *** set a breakpoint in malloc_error_break to debug
zsh: abort ./a.out
我的問題是,當我刪除a時,它會自動刪除b嗎? 這里的機制是什么,我有點迷路了。
b = a; // here the int that b pointed at "leaks" (you have no way of deleting it)
delete a; // here "a" is deleted first
delete b; // here "a" is deleted a second time (undefined behavior)
當您將a
的值分配給b
時,先前包含的值(如果您願意的話) b
將被遺忘。 然后a
和b
都指向同一個 object。 然后,您失去了delete
指向的原始 object b
的所有可能性。 然后,當您delete b
時,您實際上嘗試再次刪除a
。
讓我們逐行瀏覽代碼。
int* a = new int{12};
這將創建一個名為a
的int*
類型的新變量,並將其初始化為指向新分配的 integer,其值為 12。
int* b = new int;
這將創建一個名為b
的int*
類型的新變量,並將其初始化為指向新分配的 integer。
b = a;
這會將b
的值更改為指向a
。 在對new
的第二次調用中返回的值現在丟失了,並且 memory 被泄露,因為它不再可能傳遞給delete
。
delete a;
這將刪除 object 指向的a
指向,即首先分配的那個。
delete b;
糟糕,這試圖刪除b
指向的 object,但b
不指向當前存在的任何 object。 第一個分配的那個剛剛被刪除,並且不存在指向第二個的指針。 所以這是一個錯誤。
我懷疑你在想delete a;
刪除a
. 它不是。 它會刪除任何 object a
指向的內容,並要求a
是一個指針並指向一個有效的 object ,該有效的 object 被分配了new
。
當您刪除一個指針時,所有指向被破壞的 object 的指針、引用、迭代器等都將失效。 由於賦值b = a
, b 指向與 a 相同的 object ,所以當 a 被刪除時, b 變得無效。 刪除無效指針具有未定義的行為。
請注意, b = a
使得無法刪除 b 先前指向的分配。 這稱為 memory 泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.