2012-11-05 31 views
2

可能重複:
C++ delete - It deletes my objects but I can still access the data?在Mac OS中刪除的指針仍然在工作C++使用Xcode的X

考慮下面的代碼: -

#include <iostream> 
class Test 
{ 
public: 
    int k=10; 
}; 

int main(int argc, const char * argv[]) 
{ 
    Test *t = new Test(); 
    delete t; 
    //t1 = NULL; 
    t->k=50; 
    printf("\n%d",t->k); 
    return 0; 
} 

其輸出爲50,但t已刪除。 爲什麼它不會崩潰? 我在Mac OS X中使用Xcode。

+5

它是不確定的行爲 – billz

+0

因爲內存是不是真的刪除,它只是標記爲「無」,使用它被分配之前爲其他目的 – Aladdin

回答

1

「delete」只會通知(除調用析構函數外)堆管理器,以前使用new分配的sizeof(Test)內存塊將不再使用,堆管理員可以自由地執行任何操作那塊內存。

讓我試着給你一個關於何時相同的代碼可能導致異常的場景。

讓我們說一下,如果內存塊是由堆管理器在堆管理器從虛擬內存管理器獲取的新內存頁上分配的,因爲它無法在以前分配的頁面的任何其他地方找到空閒空間。現在,當刪除完成後,堆管理器會發現在內存頁面上分配的唯一塊會被釋放,所以它可能決定將內存頁面釋放回虛擬內存管理器。然後當你的代碼進入並訪問其頁面甚至不存在於虛擬內存中的內存時,你會得到一個錯誤。

當然,還有其他一些場景可以通過對堆管理實現的深入瞭解來實現。

0

這是一個未定義的行爲,你不應該期望任何事情。但是,內存可能還沒有寫入,它只是被標記爲空閒的,它最終會被覆蓋,這可能是它的原因。將指針設置爲NULL是一種很好的做法,以避免出現此類問題,請參閱dangling pointer問題。

+0

將它從內存中刪除它不會崩潰的程序?是t = NULL;需要 – dkumar

+0

@dkumar不是馬上,但它將被寫入最終 – iabdalkader

+0

@dkumar:操作系統將在需要時回收內存。這是一種將它設置爲NULL的做法,以便在刪除後沒有人意外嘗試訪問它。因此,'NULL'檢查用於確定指針是否保存有效的內存地址 –

1

因爲你(非)幸運。你正在調用未定義的行爲。一種可能的未定義行爲是「按照你的期望工作」。但是,你的期望值是可疑的。在刪除和該函數分配內存的用途之間添加一個函數調用,並且您可能完全破壞了一些其他數據,因爲您判斷錯誤。

未定義的行爲不必崩潰......或者不必立即崩潰。但從長遠來看,調用它通常會導致問題,特別是在更大的程序中。