2011-08-11 3 views
1

표준 QWidget 파생 클래스가 있지만 위젯이 파손되면 두 번 해제됩니다. QTreeView 포인터를 멤버 변수로 추가 할 때마다.QWidget 삭제 문제

m_treeView = new QTreeView(this); 

을 그리고는 QWidget - 파생 클래스의 소멸자는 기본 소멸자입니다 :

예컨대 : 클래스의 생성자에서

private: 
    QTreeView *m_treeView; 

, 나는 간단한을한다.

것은 내가 회원이 완전히 포인터와 어떻게 사용 포기하는 경우 :

QTreeView *treeView = new QTreeView(this); 

모든 것이 괜찮습니다. QLabel 멤버 포인터가 있으면 잘 작동합니다. 왜 내가이 행동을보고 있습니까? 포인터가 클래스의 멤버인지 여부는 클래스의 소멸자와 관련이 없어야합니다. 객체가 힙에서 만들어지기 때문에 클래스에서 멤버 변수가 가리키는 객체를 삭제하지 않으므로 사용자 정의 소멸자. 귀하는 QWidget 파생 개체가 삭제 될 때마다 당신은 당신이 new QTreeView(this) 결국 QObject(QObject * parent)를 호출하기 때문에이 문제가 발생하고 당신의 멤버 변수는 다음과 같이 추가됩니다 의미 m_treeView

를 구성 할 때 부모 개체로 this을 통과하기 때문에

+0

이 다소 평범한 문제가 될 밝혀졌다. 이 클래스를 두 번째 디렉토리로 옮겼지만 어떤 이유로 qmake가 QWidget 파생 클래스를 재 작성하는 데 필요한 MainWindow 클래스를 표시하지 않았습니다. 포인터를 멤버 변수로 추가하면 클래스 크기가 변경되어 삭제시 메모리 손상 문제가 발생합니다. 클래스 생성자의 ABI를 변경하지 않았으므로 응용 프로그램 타겟이 여전히 링크되어 있지만 QWidget 파생 클래스의 크기가 변경되면 모든 문제점이 발생합니다. –

답변

0

, m_treeView도 삭제됩니다 QWidget 파생 객체의 자식 객체.

부모 개체의 소멸자가 모든 자식 개체를 파괴합니다.

편집

the Qt docs에서 : 는 죄송합니다

그리고는 QWidget 파생 클래스의 소멸자를 놓친 것은 기본 소멸자이다.

부분

+0

그래,하지만 그건 _double_ 무료 설명하지 않습니다. 비 멤버 변수 버전도 "this"를 부모로 지정하므로 동일한 동작이 예상됩니다. 그것은 두 배의 자유가 아닌 부패가되어 버렸습니다. 그것은 파일 이동과 qmake로 인해 메모리 손상으로 판명되었습니다. 내 원래 질문에 대한 의견으로 자세한 내용을 게시했습니다. –

+0

@Jonathan 나는 포인터를 직접 지웠을 것이라고 생각했지만 질문을 다시 읽었을 때, – dirk