2014-04-21 7 views
4

이제 부모 개체가 삭제되면 Qt가 모든 자식 개체의 메모리를 해제한다는 것을 알게되었습니다. 또한, 일반적으로 스택 상에 생성 된 객체 (즉, 포인터가 아닌 객체)에 대한 메모리 관리는 신경 쓸 필요가 없다. addressbook.h addressbook.cpp 여기 finddialog.hQt의 메모리 관리 : AddressBook 튜토리얼

dialog 개인 회원입니다 :

AddressBook::AddressBook(QWidget *parent) : QWidget(parent) 
{ 
    dialog = new FindDialog; 
} 

완전한 소스로 볼 수 있습니다 : 나는 "AddressBook" tutorial 아주 좋은했을 때

지금, 나는 부분 (5)이 발견 AddressBook이고, FindDialog에 대한 포인터입니다. FindDialogQDialog을 상속하지만 this은 없습니다. - 포인터가 생성자로 전달됩니다 (위 참조). 에도 불구하고,

가 [의 FindDialog의] 생성자는 부모는 QWidget을 허용하도록 정의 : 명시 적 소멸자 this은 의도적 인 것 같다 통과하지, 또한 ... 더 delete dialog 울어가없는,

을 존재하지 않는다 대화 상자가 별도의 창으로 열립니다.

메모리 누수가 발생하지 않습니까? 아니면 자동으로 dialog을 삭제하고 메모리를 비울 수있는 다른 메커니즘이 있습니까?

미리 도움을 청하십시오!

업데이트 :이 문제는 qt-project.org forums에 게시되었으며 곧 수정 될 예정입니다.

+1

니스.'Q_OBJECT' 매크로를 사용하여 실제로 마술이 일어나지 않는 한, 메모리 누수가 거의 확실합니다. [valgrind] (http://valgrind.org/)를 사용하여 확실하게 확인할 수 있습니다. 그러나'AddressBook'은 애플리케이션의 수명을 연장하기 때문에 무의미합니다. 그래도 튜토리얼에서, 그것은 당신과 같은 우려를 제기하는 것을 피하기 위해 해방되어야합니다. –

+0

@MattPhillips 그러나 응용 프로그램의 수명 만 지속되는'AddressBook'은'dialog'에 영향을 미치지 않습니까? 스택 상에 생성되었지만 여기서는 그렇지 않다면 ... –

+1

요점은,'AddressBook' 인스턴스는 애플리케이션이 종료 될 때 파괴됩니다.이 시점에서' 대화 상자 '가 해제됩니다. 따라서 메모리 누수는 피할 수 있지만 스타일이 좋지 않고 조정할 수없는 방식입니다. –

답변

3

이 대한 변명이 없습니다, 당신은 단지 즉, 불러보다 결국 더 문제가 있습니다 :

그것은 관리되지
  • 당신이 말한대로.

  • 기존의 새로운 Foo() 구문을 사용하지 않습니다.

  • 이것은 생성자의 초기화 목록에서 수행되지 않습니다.

OS가 응용 프로그램이 종료되면이 기능이 해제되지만 여전히 문제는 아닙니다. 여하튼, 예제 프로젝트에서 특히 그렇습니다. 적절한 픽스는 힙 오브젝트 대신 스택 오브젝트 나 QPointer을 사용하는 것입니다.

이 경우 후자를 자세한 내용은 다음 게시물을 참조 :

How to crash (almost) every Qt/KDE Application and how to fix

이보고 상류에 고정되어야한다; 좋은 캐치!

나는 in here에 대해 Gerrit에게 변경 사항을 제출했습니다.

+0

정보 및 블로그 항목에 대한 링크를 보내 주셔서 감사합니다. 매우 흥미 롭습니다! 방금 qt-project.org-Forum에서이 문제를 해결할 것을 제안했습니다. –

+0

'new Foo' 대'new Foo()'구문에 대한 추가 참고 사항 bullet point :'Dialog'는 * POD 타입이 아니기 때문에 똑같은 일을하지만'()'를 사용하면 여전히 좋을 것입니다 연습. 예를 들어 [여기] (http://stackoverflow.com/a/620402/1717300)에 대해 자세히 알아보십시오. – hyde

+0

@hyde : POD가 아닌 유형조차도 C++ 03 이상을 사용하는 [초기화되지 않은 vs 기본값/값 초기화 된 차이] (http://stackoverflow.com/a/620402/2682142)로 분류됩니다. 그것들은 C++ 98에서 유사하게 초기화되지 않았기 때문에 표준 변형에도 의존합니다. 그러나 업데이트가 작성되면 Gerrit에 제출 된 변경 사항이있어 힙보다는 오브젝트 스택을 만듭니다. – lpapp