我使用了一个 QSGGeometry、QSGVertexColorMaterial 和一个 QSGGeometryNode,在我的 QQuickItem 派生类 MyQuickItem 上实时绘制一些东西。
以下是我的 updatePaintNode 方法,其中重新绘制逻辑的关键点。
我分配它们并且不删除它们。这是因为它们应该被删除的地方在
次要问题: 我正在使用
附言: 我再次强调:这种实现没有性能问题。我只想确定我没有造成任何内存泄漏。我尝试将
以下是我的 updatePaintNode 方法,其中重新绘制逻辑的关键点。
QSGNode * MyQuickItem::updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * updatePaintNodeData) {
if (!oldNode) {
oldNode = new QSGNode;
}
oldNode->removeAllChildNodes();
QSGGeometry * geometry = GetMyGeometry();
QSGVertexColorMaterial * material = new QSGVertexColorMaterial;
QSGGeometryNode * child_node = new QSGGeometryNode;
child_node->setGeometry(geometry);
child_node->setMaterial(material);
child_node->setFlag(QSGNode::OwnsMaterial);
oldNode->appendChildNode(child_node);
return oldNode;
}
问题:
上述逻辑非常好。没有任何功能问题,也没有性能问题。但是我担心我正在造成内存泄漏。请看上面方法updatePaintNode
中的以下两行,其中我分配了原始指针。
QSGVertexColorMaterial * material = new QSGVertexColorMaterial;
QSGGeometryNode * child_node = new QSGGeometryNode;
我分配它们并且不删除它们。这是因为它们应该被删除的地方在
updatePaintNode
完成之后。而那不在我的控制范围内。
问题:
如何确保2个指针material
和child_node
正确地从内存中清除?
像我上面所做的child_node->setFlag(QSGNode::OwnsMaterial)
一样,是否设置了指针的所有权到QtSceneGraph并使我免于删除指针的负担?次要问题: 我正在使用
oldNode->removeAllChildNodes()
来清除前一帧中绘制的数据。这是在绘制新数据之前清除屏幕上先前数据的好方法吗?附言: 我再次强调:这种实现没有性能问题。我只想确定我没有造成任何内存泄漏。我尝试将
material
和child_node
用作智能指针,如下所示:auto material = std::make_shared<QSGVertexColorMaterial>();
auto child_node = new std::make_shared<QSGGeometryNode>();
但是当material
和child_node
在稍后被自动清除内存时,这会导致崩溃。