2012-01-27 20 views
1

フレームを閉じると、自分のプログラムがクラッシュし続けます。私は原因を2行の問題コードに絞り込んだが、なぜ彼らがクラッシュしているのか分からない。
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); 
} 

奇妙な問題2は、プログラムをクラッシュされませんでした。私のコードに何が問題なのですか?

+0

あなたの問題はメモリアクセスに関連しているようです - それに 'valgrind'を実行しようとしましたか? –

+0

valgrindとは? – Eva

+1

http://valgrind.org/ –

答えて

1

はwxWidgetsのは、ウィジェットのためのメモリ管理の独自の形をしていることに注意してください。そのため、ウィジェットタイプのメモリを動的に割り当てる場合は、deleteを呼び出せるオブジェクトにそのウィジェットのアドレスを渡しますが、そのウィジェットの親はそのウィジェットを破棄するためにwxWidgets実行時に指定されます親ウィジェットが破棄されると、二重削除のケースに入ります。そうでない場合、子ウィジェットは有効なオブジェクトであると見なします。共有ポインタ型は、基本的にオブジェクトを "所有"しているので、オブジェクトを動的に割り当てて共有ポインタ型に渡すと、間違って別の2つのメモリでポインタが "所有"されていないことを確認してください。経路を再生する。

+0

共有ポインタは引き続き使用する必要がありますか? – Eva

+1

それは依存します...あなたが共有するか、または他のスマートなポインタ型を使用する場合、あなたがそれを渡すどんな動的に割り当てられたオブジェクトがそのオブジェクトタイプによってだけ "管理"されることを確かめてください。私はあなたの 'TetrisFrame'オブジェクトの' this'ポインタを渡すので、 'Board'オブジェクトについては疑いがあります。通常、wxWidgetsでは、動的に割り当てられたウィジェットがその親ウィジェットによって「管理」されることを意味します。 caseは 'TetrisFrame'オブジェクトのインスタンスです。私はあなたのコードをすべて見ることができないので、私は典型的なwxWidgetsプログラミングパラダイムに基づいて推測しました。 – Jason

関連する問題