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 클래스의 private 멤버 변수 :

wxSharedPtr<StatusController> statusController_; 
wxSharedPtr<TetrisController> tetrisController_; 

StatusController 클래스 전용 섹션 :

typedef wxSharedPtr<TetrisFrame> ViewPtr; 
wxSharedPtr<Statuses> model_; 
std::vector<ViewPtr> views_; 

보드 클래스의 private 멤버 변수 :

여기 내 코드의 일부입니다
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는 위젯을위한 자체 메모리 관리 형식을 사용합니다. 따라서 동적으로 위젯 유형의 메모리를 할당하고 그 위젯의 부모가 해당 위젯을 파괴하기 위해 wxWidgets 런타임에 의해 지정되는 동안 delete을 호출 할 수있는 객체에 해당 위젯의 주소를 전달하면 부모 위젯이 파괴되면 이중 삭제의 경우로 진행하거나 자식 위젯이 유효하지 않은 경우 부모가 여전히 생각한다고 생각하는 경우입니다. 공유 포인터 타입은 기본적으로 객체를 "소유"할 것이므로 ... 객체를 동적으로 할당하고 실수로 두 개의 다른 메모리에 의해 포인터를 "소유"하지 않도록 공유 포인터 유형에 전달할 때, 재개발 경로.

+0

공유 포인터를 사용해야합니까? – Eva

+1

다릅니다 ... 공유 또는 다른 스마트 포인터 유형을 사용하는 경우, 동적으로 할당 된 객체는 해당 객체 유형에 의해서만 "관리"됩니다. 나는'Board' 객체에 대해 특히 의심 스럽습니다. 여러분의'TetrisFrame' 객체의'this' 포인터를 전달하기 때문입니다. 일반적으로 wxWidgets에서 이것은 동적으로 할당 된 위젯이 부모 위젯에 의해 "관리"된다는 것을 의미합니다. case는'TetrisFrame' 객체 인스턴스입니다. 이후로 모든 코드를 볼 수 없기 때문에 wxWidgets 프로그래밍 패러다임을 기반으로 교양있는 추측을하고 있습니다. – Jason

관련 문제