2012-03-11 3 views
0

메인 윈도우 응용 프로그램이 있습니다. 바로 가기가 실행되면 대화 상자에 정보가 표시되고 사용자가이 대화 상자에서 일부 구성을 수행 한 다음 다시 신호를 보냅니다. 메인 윈도우, 메인 윈도우는 몇 가지 추가 작업을 수행합니다. 의사 코드는 다음과 같습니다.Qt는 boost :: shared_ptr의 신호와 슬롯을 연결합니다.

void MainWindow::actionConfigure_triggered() 
{ 

    configureDialog = boost::shared_ptr<configure>(new configure(this)); 
    configureDialog->show(); 
    connect(configureDialog.get(), SIGNAL(reload()), this, SLOT(clean_reload())); 
} 

그러나이 함수를 여러 번 트리거하면 분할 오류가 발생합니다. 디버거를 사용하여 실행을 추적하고 SIGSEGV는 boost :: checked_delete 함수를 실행할 때 받았습니다.

도움이 될 것입니다! 미리 감사드립니다. 구성 대화 상자를 만들고 동적으로 삭제하기를 원하십니까? 아니면이를 구현하는 다른 더 좋은 방법이 있습니까?

+0

구성 대화 상자가 닫힐 때 스마트 포인터를 사용할 필요가 없다고 생각합니다. 소멸자를 호출해야합니다. 동적으로 할당 된 메모리가이 시점에서 해제되어야하므로 메모리 누수가 발생합니다. 몇 번이나 기능을합니다. – nils

+0

대화 상자는 setAttribute (Qt :: WA_DeleteOnClose)를 설정하지 않으면 닫히면 삭제되지 않습니다. –

+0

감사합니다. 당신 말이 맞습니다. – nils

답변

0

backtrace에 따르면 버그는 configure 소멸자의 어딘가에 있으며 shared_ptr과는 거의 관계가 없습니다 (소멸자를 호출하는 shared_ptr을 제외하고) 오브젝트가 이중으로 삭제되었는지 확인하십시오. 아마도 객체를 삭제하는 shared_ptr가 아닌 다른 참조 일 것입니다.

+0

답장을 보내 주셔서 감사합니다. 내가 문제를 발견, 맞아,이 shared_ptr의 문제가되지 않습니다, shared_ptr에 새로운 가치를 할당하면, 그것은 이전에 가리킨 원래 메모리를 무료로하려고합니다,이 클래스의 소멸자를 호출합니다, 버그 거짓말 configureDialog의 소멸자에서 아직 메모리를 할당하지 않은 포인터를 해제하려고 시도합니다. Qt :: WA_DeleteOnClose 플래그를 사용하면 위젯이 close 이벤트를 수락 할 때이 위젯을 삭제하게되므로 스마트 포인터 대신 메모리 누출을 방지 할 수 있습니다. – nils

관련 문제