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