【问题标题】:wxWidgets program crashes when frame closedwxWidgets 程序在框架关闭时崩溃
【发布时间】:2012-01-27 02:00:53
【问题描述】:

当我关闭框架时,我的程序不断崩溃。我已将原因缩小到两行有问题的代码,但我不确定它们为什么会崩溃。这是我的一些代码:
俄罗斯方块框架.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类私有成员变量:

wxSharedPtr<TetrisController> controller_;

相关俄罗斯方块控制器功能:

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

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

奇怪的是,在我修复了另一个导致程序崩溃的问题之前,问题二并没有导致程序崩溃。我的代码有什么问题?

【问题讨论】:

  • 您的问题似乎与内存访问有关——您是否尝试在其上运行valgrind

标签: c++ wxwidgets


【解决方案1】:

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

【讨论】:

  • 这取决于......如果您使用共享或其他智能指针类型,请确保您传递的任何动态分配的对象都只会由该对象类型“管理”。我特别怀疑Board 对象,因为您将TetrisFrame 对象的this 指针传递给它,这通常在wxWidgets 中意味着动态分配的小部件将由其父小部件“管理”,在此case 是TetrisFrame 对象实例。由于我看不到您的所有代码,因此我只是根据典型的 wxWidgets 编程范式进行有根据的猜测。
猜你喜欢
  • 1970-01-01
  • 2022-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多