2017-11-14 9 views
0

내가 하나의 QGraphicsViewGraphicsScene:public QGraphicsScene 상속 클래스 기능을포인터에서 deleteLater를 호출 한 후 segfault를 피하는 방법은 무엇입니까?

void GraphicsScene::adv() 
{ 
if (actor) 
    views().at(0)->ensureVisible(actor,200,100); 
advance(); 
} 

advance() 전화를 똑딱, IT 및 QTimer보고있는 것은 현장에있는 모든 QGraphicsItem 객체에 보낼 수있는 오버라이드 (override) 방법이다. 이 기능의 요점은 - 내가 항상 actor이 보이도록하고 싶습니다. actorunit:public QGraphicsPixmapItem의 개체는 GraphicsScene입니다.

actor의 어느 시점에서 나는 deleteLater()으로 전화합니다.

내가 views().at(0)->ensureVisible(actor,200,100); 라인

궁금에서 SEGFAULT받을 다음 타이머 틱, 왜 deleteLater()true 올바른 조건이 내가 무엇을 사용해야한다 등 if (actor) 패스?

+0

포인터를 가리키는 대상을 삭제해도 포인터 값은 자동으로 null이되지 않습니다. 따라서, 객체'actor'가 삭제 되더라도'if (actor)'는 여전히 통과됩니다. – vahancho

답변

0

나는 객체가 asynchronically deleteLater() 삭제 및 기타 객체에서 액세스 방지 할 수있는 방법이 있는지 궁금해하고있다?

예, 개체가 이미 describedQPointer<MyQObject>을 사용하여 삭제 여부를 프로그래밍 방식으로 말할 수있는 방법이있다. 그러나 그 방법은 다소 느리고 응용 프로그램 코드는이를 피하기 위해 더 나은 논리를 가져야합니다. 마찬가지로 deleteLater 코드를 호출하기 전에 views()에서 해당 객체에 대한 참조가 제거되고 코드에서 해당 뷰를 여전히 확인해야합니다.

0

actor 내부에서 deleteLater()을 호출하면 GraphicsScene 컨테이너에 여전히 포인터가 있습니다. 개체 자체는 모든 외부 포인터를 다시 설정하지 않습니다.

adv()의 if 문을 사용하려면이 포인터 (GraphicsScene)의 actor 멤버를 재설정해야합니다.