【问题标题】:Crash when adding and removing entities in Qt3D在 Qt3D 中添加和删除实体时崩溃
【发布时间】:2017-03-07 14:49:00
【问题描述】:

我有应该在运行时创建和删除的实体。实体只有材料和网格组件。材质是 QDiffuseMapMaterial 和 QTextureImage。

当实体开始在场景中添加和删除时,有时应用程序会因此断言而崩溃:

qt_assert: ASSERT: "img != nullptr" 在文件中 ../../include/Qt3DRender/5.8.0/Qt3DRender/private/../../../../../src/render/texture/apitexturemanager_p.h, 第 286 行

但不幸的是,我不知道为什么会这样。我以这种方式添加实体:

QEntity * visibleObject = new QEntity();

QDiffuseMapMaterial * material = new QDiffuseMapMaterial();

QTextureImage * diffuseTextureImage = new QTextureImage();
diffuseTextureImage->setSource(QUrl("qrc:/resources/tile.png"));
material->diffuse()->addTextureImage(diffuseTextureImage);
visibleObject->addComponent(material);

// set mesh
QPlaneMesh * mesh = new QPlaneMesh();
mesh->setWidth(1.0 / 2);
mesh->setHeight(1.0 / 2);
visibleObject->addComponent(mesh);

visibleObject->setParent(_rootEntity);

然后像这样删除:

delete visibleObject;

_rootEntity 是 cpp 代码中定义的场景根实体。使用 Scene3D 在 QML 文件中定义的场景:

 Scene3D {
     id: scene
     anchors.fill: parent
     aspects: ["render", "logic", "input"]

     entity: rootEntity
 }

_rootEntity 是这样通过的:

context->setContextProperty("rootEntity", _rootEntity);

如果有必要我可以准备简单的例子来重现问题。

谢谢。

【问题讨论】:

    标签: qt qt3d


    【解决方案1】:

    visibleObject->setParent(_rootEntity); 行表示_rootEntity 拥有visibleObject 的所有权。如果你delete visibleObject;,你会在 _rootEntity 中创建一个悬空指针。见http://doc.qt.io/qt-5/objecttrees.html。所以不要delete visibleObject;

    【讨论】:

    • 我已经尝试像这样删除它:visibleObject->setParent(nullptr); delete visibleObject; 但行为是相同的。无论如何,它似乎是 Qt 错误 (bugreports.qt.io/browse/QTBUG-59418)。
    【解决方案2】:

    看来你的麻烦在于你定义了如何错误地删除东西,任何问题的最佳解决方案是彻底消除问题。

    您是否尝试过使用智能指针?特别是共享指针?使用智能指针完全消除了挂起引用的问题,并且几乎没有与使用相关的开销。 Qt 甚至有自己专用的智能指针实现。

    如果您消除了明确指定删除对象的必要性,则指定删除不会有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2021-11-20
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多