Qt 5.7 응용 프로그램에서 최근에 exit code 255
을 경험했습니다. 내 맞춤 설정 인 QGestureRecognizer
을 추가 한 직후에 이런 일이 발생했습니다. Qt 소스로 디버깅을했고 QGestureManager
이 모든 QGestureRecognizer
인스턴스를 자동으로 삭제한다는 결론에 도달했습니다. (적어도 문서에 생성자의 서명을보고 따라)QGestureRecognizer가 QGestureManager에 의해 자동으로 삭제됩니까?
Demo::~Demo() {
// delete other stuff
delete recognizer;
}
것은이 QGestureRecognizer
지원하지 않는 것입니다 : 문제를 일으키는 라인 인식기 생성 및 등록 된 위젯의 소멸자 내부 QObject
(또는 그 근본적인 Qt 클래스의 하위 클래스)에서 파생 된 것이 아니기 때문에 Qt의 관계는 parent-child
입니다. 즉, parent
을 생성자에 할당 할 수 없으므로 QCustomGestureRecognizer recognizer = new QCustomGestureRecognizer (this)
을 사용할 수 없습니다. 이 생각의 연속을 계속하면, delete recognizer
을 호출하여 소멸자를 수동으로 트리거해야한다는 것을 의미합니다. 아니면 생각 ...
내 응용 프로그램의 수명이 끝날 때 QGestureManager
이 호출됩니다. 여기에는 m_recognizers
이라는 인식 자 목록이 있습니다. 여기에는 등록 된 사용자 지정 인식기 (내 경우에는 257
으로 등록)와 함께 내장 인식기 (예 : Tap
제스처 용)가 포함되어 있습니다. QGestureManager
의 소멸자는 목록을 반복하고 해당 항목을 삭제합니다. delete recognizer
라인이 존재하면
나는 이미 삭제 된 것을 삭제하려고 시도하기 때문에합니다 (m_recognizers
에 대한) qDeleteAll(...)
사용자 정의 인식기의 항목에 도달 세그먼트 오류를 얻을.
내 위젯의 소멸자에서 delete recognizer
행을 주석 처리 한 후에 더 이상 문제가 발생하지 않지만 어딘가에서 내 코드를 위반하지 않는다면 여전히 불확실합니다. 종료 코드는 (예상대로) 0
이 아니지만 인식 자의 처리 방법에 대한 정보는 공식 문서에서 완전히 누락되었습니다.
누구에게이 문제가 발생 했습니까? 이 문제는 코드의 다른 부분에서 발생할 가능성을 배제하지 않고 있지만 기본값 인 QWidget
소멸자가 호출 될 때 나타나는 것으로 간주되지는 않습니다. 클래스를 상속 할 때 C++ 표준에 따라 먼저 하위 클래스의 소멸자가 호출됩니다 (내 경우에는 Demo
사용자 정의 위젯입니다 - 문제 없음). 그런 다음 기본 클래스입니다.
감사합니다. 나는 그것을 많이 알았다. P 실제로 문서에서 실제로 언급 된 것을 알았습니다. – rbaleksandar