框架关闭时,wxWidgets程序崩溃

时间:2012-01-27 02:00:54

标签: c++ wxwidgets

关闭相框时,我的程序不断崩溃。我把原因归结为两行有问题的代码,但我不确定它们为什么会崩溃。这是我的一些代码:
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);
}

奇怪的是,问题二没有崩溃程序,直到我修复了另一个崩溃程序的问题。我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

请记住,wxWidgets为小部件执行自己的内存管理形式。因此,如果您为窗口小部件类型动态分配内存,然后将该窗口小部件的地址传递给可以在其上调用delete的对象,而该窗口小部件的父节点由wxWidgets运行时指定在销毁父窗口小部件时销毁该窗口小部件,然后您将遇到双删除的情况,或者父窗口仍然认为子窗口小部件是有效对象的情况。共享指针类型基本上“拥有”一个对象...因此,当您动态分配一个对象并将其传递给共享指针类型时,请确保您不会无意中使指针由两个不同的内存“拥有” - 回收途径。