关闭相框时,我的程序不断崩溃。我把原因归结为两行有问题的代码,但我不确定它们为什么会崩溃。这是我的一些代码:
TetrisFrame.cpp
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 class私有成员变量:
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 :(得分:1)
请记住,wxWidgets为小部件执行自己的内存管理形式。因此,如果您为窗口小部件类型动态分配内存,然后将该窗口小部件的地址传递给可以在其上调用delete
的对象,而该窗口小部件的父节点由wxWidgets运行时指定在销毁父窗口小部件时销毁该窗口小部件,然后您将遇到双删除的情况,或者父窗口仍然认为子窗口小部件是有效对象的情况。共享指针类型基本上“拥有”一个对象...因此,当您动态分配一个对象并将其传递给共享指针类型时,请确保您不会无意中使指针由两个不同的内存“拥有” - 回收途径。