2012-01-27 55 views
1

當我關閉框架時,我的程序不斷崩潰。我將原因縮小爲兩行有問題的代碼,但我不確定它們爲什麼會崩潰。下面是我的一些代碼:
TetrisFrame.cpp當框架關閉時wxWidgets程序崩潰

TetrisFrame::TetrisFrame() 
    : wxFrame(0, wxID_ANY, "Tetris") 
{ 
    statusController_ = new StatusController; 
    statusController_->setModel(new Statuses); 
    statusController_->addView(this); 

    tetrisController_ = new TetrisController; 
    tetrisController_->setStatusController(statusController_.get()); // Problem one 
    tetrisController_->setModel(new TetrisModel); 
    tetrisController_->addView(new Board(this)); // Problem two 
} 

TetrisFrame類私有成員變量:

wxSharedPtr<StatusController> statusController_; 
wxSharedPtr<TetrisController> tetrisController_; 

StatusController類私有部分:

typedef wxSharedPtr<TetrisFrame> ViewPtr; 
wxSharedPtr<Statuses> model_; 
std::vector<ViewPtr> views_; 

Board類私有成員變量:

wxSharedPtr<TetrisController> controller_; 

相關TetrisController功能:

void TetrisController::setStatusController(
     StatusController* statusControllerPtr) 
{ 
    statusController_ = statusControllerPtr; 
} 

void TetrisController::addView(Board* viewPtr) 
{ 
    views_.push_back(ViewPtr(viewPtr)); 
    viewPtr->setControlller(this); 
} 

奇怪的問題,有兩種沒有崩潰的程序,直到我修正了崩潰的程序的另一個問題。我的代碼有什麼問題?

+0

看來你的問題與內存訪問有關 - 你是否嘗試在其上運行'valgrind'? – 2012-01-27 02:40:46

+0

什麼是valgrind? – Eva 2012-01-27 04:06:49

+1

http://valgrind.org/ – 2012-01-27 20:13:23

回答

1

請記住,wxWidgets自己對窗口小部件進行內存管理。因此,如果您爲小部件類型動態分配內存,然後將該小部件的地址傳遞給可調用delete的對象,而該小部件的父級由wxWidgets運行時指定以銷燬該小部件當父窗口小部件被銷燬時,那麼你將碰到一個雙重刪除的情況,或者在父窗體不是的情況下仍然認爲子窗口小部件是有效的對象的情況。一個共享指針類型基本上會「擁有」一個對象......所以確保當你動態地分配一個對象並將它傳遞給一個共享指針類型時,你不會無意中使指針由兩個不同的內存「擁有」回收途徑。

+0

我還應該使用共享指針嗎? – Eva 2012-01-27 04:08:03

+1

這取決於......如果您使用共享或其他智能指針類型,請確保您傳遞的任何動態分配的對象只會由該對象類型「託管」。我特別懷疑'Board'對象,因爲你將'TetrisFrame'對象的'this'指針傳遞給它,這通常在wxWidgets中意味着動態分配的小部件將由它的parent-widget「託管」大小寫是'TetrisFrame'對象實例。由於我看不到所有的代碼,我只是根據典型的wxWidgets編程範例進行了有根據的猜測。 – Jason 2012-01-27 05:01:16