C++ wxWidgets程序在框架关闭时崩溃

C++ wxWidgets程序在框架关闭时崩溃,c++,wxwidgets,C++,Wxwidgets,当我关闭框架时,我的程序不断崩溃。我已经将原因缩小到两行有问题的代码,但我不确定它们为什么会崩溃。下面是我的一些代码: TetrisFrame.cpp TetrisFrame::TetrisFrame() : wxFrame(0, wxID_ANY, "Tetris") { statusController_ = new StatusController; statusController_->setModel(new Statuses); statusCo

当我关闭框架时,我的程序不断崩溃。我已经将原因缩小到两行有问题的代码,但我不确定它们为什么会崩溃。下面是我的一些代码:
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_;
wxSharedPtr<TetrisController> controller_;

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

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

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

您的问题似乎与内存访问有关--您是否尝试在其上运行
valgrind
?您的问题似乎与内存访问有关--您是否尝试在其上运行
valgrind
?这取决于。。。如果您使用共享或其他智能指针类型,请确保您传递的任何动态分配对象都将仅由该对象类型“管理”。我特别怀疑
Board
对象,因为您将
TetrisFrame
对象的
this
指针传递给它,这通常在wxWidgets中意味着动态分配的小部件将由它的父小部件“管理”,在这种情况下,父小部件就是
TetrisFrame
对象实例。因为我看不到你所有的代码,所以我只是根据典型的wxWidgets编程范例做一个有根据的猜测。。。如果您使用共享或其他智能指针类型,请确保您传递的任何动态分配对象都将仅由该对象类型“管理”。我特别怀疑
Board
对象,因为您将
TetrisFrame
对象的
this
指针传递给它,这通常在wxWidgets中意味着动态分配的小部件将由它的父小部件“管理”,在这种情况下,父小部件就是
TetrisFrame
对象实例。因为我看不到您的所有代码,所以我只是根据典型的wxWidgets编程范例进行了一个有根据的猜测。
wxSharedPtr<TetrisController> controller_;
void TetrisController::setStatusController(
        StatusController* statusControllerPtr)
{
    statusController_ = statusControllerPtr;
}

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