2014-08-30 2 views
1

this을 읽었지 만, 코드에 대해 잘못된 점을 이해하지 못했습니다.wxWidgets : 사용자 정의 모달 대화 상자를 닫을 때 메모리 오류가 발생했습니다.

wxDialog을 확장하는 클래스 인 bmNewFromImageDialog.h은 다음과 같습니다.

#ifndef BMNEWFROMIMAGEDIALOG_H 
#define BMNEWFROMIMAGEDIALOG_H 

#include "./../utils/includer.h" // includes a bunch of wx-related files 
class bmNewFromImageDialog : public wxDialog { 
public: 
    wxBoxSizer *mainVBox, *flagHBox, *OKCancelHBox; 
    wxStaticBox *flagsSBox; 
    wxButton *OKButton, *cancelButton; 
    wxRadioButton *GT0RadioButton; 

    bmNewFromImageDialog() {} 
    bmNewFromImageDialog(wxWindow *parent); 

    void init(); 
}; 

#endif 

여기는 bmNewFromImageDialog.cpp입니다.

#include "./bmNewFromImageDialog.h" 
#include "./../utils/includer.h" 

bmNewFromImageDialog::bmNewFromImageDialog(wxWindow *parent) : wxDialog(parent, -1, wxT("new image..."), wxDefaultPosition, wxDefaultSize) { 
    init(); 
} 

void bmNewFromImageDialog::init() { 
    mainVBox = new wxBoxSizer(wxVERTICAL); 
    flagHBox = new wxBoxSizer(wxHORIZONTAL); 
    OKCancelHBox = new wxBoxSizer(wxHORIZONTAL); 

    flagsSBox = new wxStaticBox(this, -1, wxT("Color flags"), wxPoint(0, 0), wxDefaultSize); 
    GT0RadioButton = new wxRadioButton(this, -1, wxT(">0: 3 channels"), wxPoint(0, 0)); 
    flagsSBox->AddChild(GT0RadioButton); 
    flagHBox->Add(flagsSBox, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 10); 

    OKButton = new wxButton(this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize(100, 40)); 
    cancelButton = new wxButton(this, wxID_CANCEL, wxT("cancel"), wxDefaultPosition, wxSize(100, 40)); 
    OKCancelHBox->Add(OKButton, 1); 
    OKCancelHBox->Add(cancelButton, 1, wxLEFT, 5); 

    mainVBox->Add(flagHBox, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 10); 
    mainVBox->Add(OKCancelHBox, 0, wxALIGN_CENTER | wxBOTTOM, 10); 
    SetSizer(mainVBox); 
    Center(); 
} 

내가 코드에서 대화 상자를 사용하는 방법이있다 : 나는 확인을 클릭합니다/닫을 때

bmNewFromImageDialog *newDialog = new bmNewFromImageDialog(this); 
newDialog->ShowModal(); 
delete newDialog; 

나는 끊임없이 런타임에 처리되지 않은 메모리 예외 오류가/그 bmNewFromImageDialog에 취소를 클릭합니다. 이 문제를 어떻게 해결해야합니까?

편집

@ 선생님-딕비 - 치킨 시저가 나는 .Destroy() 스택 솔루션을 시도했지만 같은 오류가 여전히있다 :

enter image description here

답변

0
flagsSBox = new wxStaticBox(this, -1, wxT("Color flags"), wxPoint(0, 0), wxDefaultSize); 
GT0RadioButton = new wxRadioButton(this, -1, wxT(">0: 3 channels"), wxPoint(0, 0)); 
flagsSBox->AddChild(GT0RadioButton); 
//   ^^^^^^^^ this looks very wrong 

을 헤더 파일. 당신이하고있는 일을 정말로 알지 못한다면 그것을 사용하지 마십시오.

GT0RadioButton을 부모로 사용하여 flagsSBox으로 작성하는 경우 코드가 작동해야합니다 (AddChild 호출 삭제).

wxStaticBoxSizer도보세요.

+0

감사! 이것은 그 라인을 주석으로 처리했습니다. –

0

이 블록 :

bmNewFromImageDialog *newDialog = new bmNewFromImageDialog(this); 
newDialog->ShowModal(); 
delete newDialog; 

로 변경해야합니다.

bmNewFromImageDialog *newDialog = new bmNewFromImageDialog(nullptr); 
newDialog->ShowModal(); 
newDialog->Destroy(); 

wx 위젯 클래스에서는 delete을 절대 호출하지 마십시오. 으로 사용자 VZ 지적

wxWidgets documentation, 모달 대화 상자 : 당신이 위젯을 할당 해제 상위 계층에서 제거를 사용하는 사이 저에서 분리해야하는 경우 다음 Destroy();

편집 전화 힙에 만들 필요가없는 몇 가지 wx 위젯 클래스 중 하나입니다. 그래서 당신은 객체가 범위를 벗어나 한 번 당신을 위해 소멸자 핸들 정리를 스택에 대화 상자를 생성 할 수 있습니다 다음에 문서화하고, "대부분의 구현"으로 표시되어 호출

bmNewFromImageDialog newDialog = bmNewFromImageDialog(nullptr); 
newDialog.ShowModal(); 
+0

정확하지만 힙 대신 스택에 대화 상자를 만드는 것이 더 간단하고 우수합니다. –

+0

참. 모달 대화 상자는 힙에서 만들 필요가없는 몇 안되는 wxWidgets 창 중 하나라는 사실을 항상 잊어 버립니다. –

관련 문제