2014-03-25 23 views
1

如果標題是不明確的,我有這樣的例子:如何在訪問已刪除的內存塊時避免錯誤?

int *a = new int[5]; 
    int*b = a; 
    delete[] a; 
    a = NULL; 

現在a爲NULL,但b不是。如果我訪問b,它將返回錯誤的值並可能導致程序崩潰。

如何預防?

+1

這必須是'delete [] a'。 –

+0

謝謝,你是對的! – Tiana987642

+4

兩種解決方案:不要使用指針(這是我推薦的,C++已經大大降低了對指針的需求),或者使用[smart](http://en.cppreference.com/w/cpp/memory/shared_ptr) [指針](http://en.cppreference.com/w/cpp/memory/unique_ptr)。 –

回答

4

現在是空

不完全是。 a指向一些「無效」(delete -d)內存。如果您希望它是NULL,請手動取消它。


delete a; 

必須

delete[] a; 

如何防止這種情況發生?

沒辦法,如果你真的需要使用(原始)指針 - 只要小心使用a的生命週期。它與參考文獻相似 - 你也應該小心。

爲了避免類似的情況,智能指針很有用。或者只是使用堆棧變量(當然,如果適用的話)。

+0

好吧,你能提供一種解決方法嗎?就像我們試圖創建一個池來容納所有的對象,而不是使用'delete',但這是行不通的。 ! – Tiana987642

+0

@ Tiana987642你不能只留下懸掛指針嗎?這是非常具體的事情。 –

+0

@ Tiana987642 - 「所謂的解決方法」是使用引用計數指針,它是智能(共享)指針或其他類型的智能指針,根據需要而定 –

相關問題