2016-10-10 114 views
-5

我正在用C++試驗「新」 - 「刪除」和內存分配。在下面的程序:刪除指針問題

int* getPtrToFive() {  
    int x =5; 
    int *y = new int; 
    y = &x; 

    return y; 
} 

int main() { 
    int *p = getpoint(); 
    cout << *p << endl; 
    delete p; 
} 

getpoint功能,我創建的堆內存,以確保它指向局部變量x的地址指針y將函數執行後返回。然後我想取消分配y的內存,但是當我刪除指針p時出現main錯誤... 您能看到這裏出了什麼問題嗎?提前致謝。

+2

你只能'刪除'用'new'創建的內容。 '&x'指向棧上的一個地址。你的意思是寫'* y = x;'? –

+0

'delete'只能用於'new' – roottraveller

+2

你正在返回並且是局部變量的地址。未定義的行爲 – Raindrop7

回答

3

y = &x;在這裏,您將「y」設置爲指向除分配內存以外的其他內容。它不再指向可以刪除的動態分配內存。

此外,由於現在沒有指針指向動態分配的內存,因此您還創建了內存泄漏。

0

在你的例子中有一個內存泄漏:你在堆上創建y並且沒有釋放它,你給y分配另一個地址(x的堆棧內存),所以分配給new的內存已經泄漏。

第二個災難是:你正在返回一個局部變量(& x)。所以在你的函數返回後x會被破壞,因此你正面臨一個未定義的行爲。

第三個錯誤是:調用堆棧內存上的刪除將發出斷言。

要做的正確事情:使指針僅存儲x的值而不是地址並返回該指針。在主可以,只要它是刪除指針在堆上:

int* getPtrToFive() 
{  
    int x = 5; 
    int *y = new int(x); // y points to an address on the heap not to x's. we store value of x in pointer 

    return y; 
} 

int main() 
{ 
    int *p = getpoint(); 
    cout << *p << endl; 
    delete p; 
} 
0

隨着「新」你堆動態分配內存,你有責任disallocate此內存。你用'刪除'來做。如果將var x指定給指針,則不再有權訪問此內存。

0

delete學習的第一件事就是它不會刪除指針

刪除對象指針指向

現在:當調用delete時,p指向什麼?它指向getPtrToFive內部的本地x,因爲這就是y = &x所做的,而不是以新的返回的匿名方式。這就是你想要的(你真正想要的)?

不是?!?那麼首先要了解y = &x*y = x之間的差異。

new返回的指針在哪裏?

它被存儲在y。然後y(一個指針)收到x的地址。舊地址已經消失。忘記了。蒸發。 new返回的int自由浮動程序員堆空間沒有什麼更能夠捕捉它。你第一次內存泄漏。

那麼刪除p是什麼?它試圖返回到程序堆中的一塊不屬於它的內存:它屬於堆棧。運行時支持發現你很幸運。