簡體   English   中英

C++:memory 當我刪除由 new 創建的指針時出現問題

[英]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將被遺忘。 然后ab都指向同一個 object。 然后,您失去了delete指向的原始 object b的所有可能性。 然后,當您delete b時,您實際上嘗試再次刪除a

讓我們逐行瀏覽代碼。

int* a = new int{12};

這將創建一個名為aint*類型的新變量,並將其初始化為指向新分配的 integer,其值為 12。

int* b = new int;

這將創建一個名為bint*類型的新變量,並將其初始化為指向新分配的 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.

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