2012-01-27 2 views
1

Моя программа продолжает сбой при закрытии рамки. Я сузил причину до двух строк проблемного кода, но я не уверен, почему они терпят крах. Вот некоторые из моего кода:
TetrisFrame.cpp классаwxWidgets сбой программ при закрытии фрейма

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_; 

совета класса частных членов переменные:

wxSharedPtr<TetrisController> controller_; 

соответствующие TetrisController функции:

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

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

Как ни странно проблема два не разбивая программу, пока не фиксируется еще одна проблема, которая была сбой программы. Что случилось с моим кодом?

+0

кажется, что ваша проблема связана с доступом к памяти - вы пытались запустить 'valgrind' на нем? –

+0

Что такое valgrind? – Eva

+1

http://valgrind.org/ –

ответ

1

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

+0

Должен ли я использовать общие указатели? – Eva

+1

Это зависит ... если вы используете общий или другой тип интеллектуального указателя, убедитесь, что любой динамически выделенный объект, который вы передаете, будет только «управляться» этим типом объекта. Я подозреваю, особенно в отношении объекта 'Board', потому что вы передаете ему указатель' this' вашего объекта TetrisFrame, который, как правило, в wxWidgets означает, что динамически выделенный виджет будет «управляться» его родительским виджетами, который в этом case - экземпляр объекта TetrisFrame. Поскольку я не вижу весь ваш код, я просто делаю обоснованное предположение, основанное на типичной парадигме программирования wxWidgets. – Jason

Смежные вопросы