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);
}