2014-02-27 31 views
0

我有一個基於文本的小遊戲我正在處理,而且我有一個基本結束遊戲的功能,如果用戶通過這行代碼選擇選項:C++試圖刪除一個不存在的指針

void MainMenu::Exit() 
{ 
    std::exit(0); 
} 

這是罰款和所有,但MainMenu的析構函數被調用,其中包含刪除呼叫我使用new關鍵字創建的指針(所以我想我需要在退出程序之前,需要手動刪除的對象)。該對象是我的世界類,它是在用戶選擇播放時創建的。但是,用戶可以在世界指針創建之前退出主菜單,因此編譯器不知道指針指向的位置。我試圖改變的析構函數,看看世界目的是NULL,就像這樣:

MainMenu::~MainMenu() 
{ 
    if(world != NULL) 
     delete world; 
} 

但我仍然得到一個彈出窗口告訴我,我的程序已停止響應,並且我需要手動殺死它。

基本上我的問題是,有沒有辦法告訴指針是否實際指向某些東西?我甚至需要手動處理刪除指針嗎?

+5

那空檢查是多餘的。 – chris

+1

「MainMenu」的構造函數是什麼樣的?你用0初始化'world'嗎? – PomfCaster

+0

請注意一般情況下,你不應該需要析構函數或者'delete'因爲你應該使用諸如'std :: vector'和智能指針來管理他們擁有的內存。手動內存管理可以很快失控。 – chris

回答

0

是的,在C++中,你必須確保每個'新'與'刪除'相匹配。你應該在你初始化世界NULL的MainMenu男星保證(或preferrably nullptr如果你的編譯器支持的話):

MainMenu::MainMenu (/* more stuff here */) : world (nullptr) 
{ 
// more stuff here 
} 

此外,克里斯指出,你沒有刪除的時候測試NULL:

MainMenu::~MainMenu() 
{ 
delete world; // no-op if world is null 
} 

不知道爲什麼你的程序掛起,但。似乎如果你沒有初始化「世界」爲空,它應該seg段錯誤。

+0

謝謝你,我來自Java,這是危險的事情,但它解決了問題! – user3316633

+0

我第二次使用std :: unique_ptr。簡單地聲明世界:std :: unique_ptr world(new WorldClass);併爲您管理刪除。 – Steger

+0

謝謝,簡單易懂!但是請等一下,我可以在堆空間中使用智能指針嗎?我認爲堆棧空間在對象不在範圍內時會自動刪除指針。編輯,沒關係,沒有注意到那裏的新關鍵字... – user3316633

0

您必須在類的構造函數中初始化指針。可以在不檢查指針是否等於NULL的情況下寫入析構函數。

MainMenu::~MainMenu() 
{ 
     delete world; 
} 

而且它是更好的使用標準的智能指針,例如std::unique_ptr

+0

你能詳細說明什麼是智能指針?我正在閱讀爲C++ 11更新的C++書籍,到目前爲止我沒有被告知只使用指針(而不是「智能」版本)。 – user3316633

+0

我會在刪除後添加一個'world = NULL',因爲這是很好的做法,可能會幫助OP捕獲其他錯誤。 – AndyG

+0

@AndyG我認爲'刪除'的全部意思是刪除指針指向的內存塊的實際指針(可怕地解釋),那麼如何將指針設置爲空可以做任何事情?這只是保證確保指針實際被切斷? – user3316633