在指针上调用deleteLater后如何避免segfault?

时间:2017-11-14 21:18:22

标签: qt qgraphicsscene

我有一个GraphicsScene:public QGraphicsScene继承的类,只有一个QGraphicsView查看它并QTimer,勾选调用函数

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

advance()是一种覆盖方法,可以发送到场景中的所有QGraphicsItem个对象。这个功能的要点 - 我想确保actor始终可见。 actorunit:public QGraphicsPixmapItem上的GraphicsScene个对象。

actor方法的某个时刻,我致电deleteLater()

下一个计时器刻度我在SEGFAULT

收到views().at(0)->ensureVisible(actor,200,100);

我想知道,为什么if (actor)true之后以deleteLater()传递,我应该使用哪种正确的条件?

2 个答案:

答案 0 :(得分:0)

  

我有deleteLater()异步删除的对象   并想知道是否有办法阻止从其他人访问它   对象

是的,有一种方法可以使用QPointer<MyQObject>作为described以编程方式判断对象是否已被删除。但是这种方式有点慢,你的应用程序代码应该有更好的逻辑来避免这种情况。比如,在调用deleteLater之前,您的代码会删除该对象的引用,例如views(),您的代码应检查该视图是否存在。

答案 1 :(得分:0)

如果您从deleteLater()内部调用actor,则容器GraphicsScene仍然有指针 - 对象本身并不会重置所有外部指针。< / p>

您必须重置此指针 - actor的成员GraphicsScene才能在adv()工作中获取您的if语句。