2016-08-03 2 views
0

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 사용자 정의 위젯입니다 - 문제 없음). 그런 다음 기본 클래스입니다.

답변

1

당신이 개체의 소유권을 가져 않습니다

Qt::GestureType QGestureRecognizer::registerRecognizer(QGestureRecognizer *recognizer) 

시스템을 사용하고 스스로를 삭제하지 않아야합니다. 문서에서

발췌 :

응용 프로그램은 인식의 소유권을하고 그와 관련된 제스처 유형 ID를 반환합니다.

+0

감사합니다. 나는 그것을 많이 알았다. P 실제로 문서에서 실제로 언급 된 것을 알았습니다. – rbaleksandar

관련 문제