Программа wxWidgets вылетает при закрытии кадра - PullRequest
1 голос
/ 27 января 2012

Моя программа продолжает падать, когда я закрываю фрейм.Я сузил причину до двух строк проблемного кода, но я не уверен, почему они дают сбой.Вот мой код:
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:

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 Ответ

1 голос
/ 27 января 2012

Имейте в виду, что wxWidgets имеет свою собственную форму управления памятью для виджетов.Так что, если вы динамически выделяете память для типа виджета, а затем передаете адрес этого виджета объекту, который может вызывать delete, в то время как родительский элемент этого виджета определяется средой выполнения wxWidgets для уничтоженияэтот виджет, когда родительский виджет уничтожен, тогда вы столкнетесь со случаем двойного удаления или случаем, когда родитель все еще думает, что дочерний виджет является допустимым объектом, когда это не так.Тип разделяемого указателя будет в основном «владеть» объектом ... поэтому убедитесь, что при динамическом выделении объекта и передаче его типу совместно используемого указателя вы случайно не делаете указатель «принадлежащим» двум различным памяти.исправление путей.

...