2014-08-31 78 views
-2

我的第一個C++分配的一個要求是我們必須確保分配的任何空間都已分配。然而,當我試圖確定是否以及如何釋放非指針變量時遇到了問題。我見過的範圍,這些變量被釋放的是外面,但可能一個也有:C++通過使用&爲其指針取消分配集變量

int var_name=new int(6); 
... 
delete &var_name; 

似乎都跑,但我不明白爲什麼或如何重新分配的地址可能會導致問題。 謝謝。

+1

你沒有分配它,爲什麼你想要釋放它?釋放分配的元素(在堆中)。不在堆棧中。 – 2014-08-31 05:48:29

+0

似乎是重複或至少非常類似於:http://stackoverflow.com/questions/9026640 – Rufflewind 2014-08-31 05:48:58

+0

謝謝,就像我說的第一項任務仍然試圖讓我的方向在語言,我很難搞清楚如何問我的問題。這會導致問題還是它是多餘的? – 2014-08-31 06:41:16

回答

0

有幾個點,你可以記住:

  1. 內存必須取消分配,只有當它已經使用了新的運營商明確分配。如果沒有使用新的操作符,則內存將分配到堆棧上,並且在超出範圍時將被分配。另一方面,使用新操作符時,內存被分配到堆上,並且必須被明確刪除。試想一下:

    無效樂趣(){

    // 1. memory allocation on stack 
    int var_on_stack = 10; 
    
    // 2. memory allocation on heap 
    int* var_on_heap_ptr = new int (10); 
    
    // 3. delete memory allocated on heap 
    delete var_on_heap_ptr; 
    

    }

陳述1所,4個字節(考慮整數佔用4個字節)被分配給var_on_stack。該內存位於堆棧上,不需要明確刪除。 在聲明2中,再次在堆上分配4個字節,並將第一個位置的地址分配給var_on_heap_ptr。當使用new在堆上分配內存時,編譯器將分配所需的內存量並返回第一個內存位置的地址。這就是爲什麼var_on_heap_ptr被聲明爲一個整型指針的原因。此內存分配在堆上,必須由用戶使用delete操作符明確刪除。在你的問題中,你寫了你的第一個陳述作品。它不應該。你必須聲明var_name爲int *而不是int,否則你會得到編譯錯誤。

  1. 當取消分配在堆上分配的內存時,請使用delete操作符。刪除操作符將一個指針作爲參數,並假定指針指向的內存位置是使用new運算符分配的。記住它會假設並且不會驗證。如果你傳遞一個棧變量的地址來刪除,那麼這個內存將被重新分配兩次。一旦刪除操作員,並且當變量超出範圍時再次刪除操作員。正如任何C++程序員會告訴你的,這是一場絕好的災難。

  2. 再考慮下面的語句:

    INT * var_on_heap_ptr = INT新(10);

    這裏指針變量var_on_heap_ptr將包含分配在堆上的內存地址,但變量本身將駐留在堆棧上。這意味着編譯器將首先爲指針變量var_on_heap_ptr分配四個字節(通常,指針變量將佔用四個字節,但它可以與機器相關)。該內存在堆棧中。接下來,編譯器將爲堆上的整數分配四個字節,並將這四個字節的第一個地址存儲在var_on_heap_ptr變量中。這意味着變量本身在堆棧上,但它的值是(即指向)堆中分配的內存位置的地址。當你說 刪除var_on_heap_ptr; 編譯器將取消分配「由var_on_heap_ptr指向的內存」,即分配在堆上的內存。然後當你超出範圍時,分配給var_on_heap_ptr變量的內存將被編譯器取消分配,因爲該變量處於堆棧上。因此,分配給堆和堆棧的所有內存都將被分配。

  3. 最後一點。請注意,刪除操作符將刪除var_on_heap_ptr變量所指向的內存,但會保持變量的內容不變。這意味着,如果var_on_heap_ptr在刪除操作之前包含0xaabbccdd作爲內存地址,則即使在刪除操作完成後,它也將繼續保留0xaabbccdd。不同之處在於,在刪除指針變量之前,指針指向堆中分配的內存,但是在刪除之後內存已經被釋放,變量現在指向取消分配的內存(現在可以分配給其他進程),因此不能依靠。這意味着如果你現在嘗試使用指針變量,你的程序可能會崩潰。此外,如果您嘗試刪除變量兩次,編譯器將再次嘗試取消分配該變量指向的內存,結果可能是災難性的。爲了避免這種情況,在調用指針變量的delete操作之後,它很好地將指針變量設置爲NULL,以便即使有人再次調用此變量的delete,程序也不會崩潰,因爲NULL上的刪除操作是安全的。

    希望這會有所幫助。

+0

感謝這正是我需要的 – 2014-08-31 08:31:14

0

您只需取消分配您已使用new初始化的變量。