gpt4 book ai didi

c++ - OpenSceneGraph 内存管理

转载 作者:行者123 更新时间:2023-11-30 03:55:59 25 4
gpt4 key购买 nike

我最近开始使用 OpenSceneGraph。我想知道它如何处理内存管理(如果有的话)。例如,我们有几何类。正如您所期望的,几何类接受顶点、颜色、纹理坐标的数组。除了,它期望这些东西作为指向对象的指针:

void Geometry::setVertexArray(Array* array)
{
if (array && array->getBinding()==osg::Array::BIND_UNDEFINED) array->setBinding(osg::Array::BIND_PER_VERTEX);

_vertexArray = array;

dirtyDisplayList();
dirtyBound();

if (_useVertexBufferObjects && array) addVertexBufferObjectIfRequired(array);
}

这是来自 OpenSceneGraph 源代码。如您所见,一个 Array* 被传递给该方法,该方法应由用户分配。如果是这样,谁删除它?显然不是 OSG(这是有道理的),因为我们可以看到它在分配新数组指针时盲目地覆盖了最后一个数组指针。这很好,但是现在用户必须确保他们分配的数组比几何类长。此外,对于用户提供此几何对象的每个数组,他们必须保留对此数组的引用。

这给我们留下了数量荒谬的指针,只有在对象被删除后才能删除这些指针。结果是我发现这使用起来非常麻烦。我在这里错过了什么吗?为什么系统要这样设计?

最佳答案

osg::ref_ptr<Array>             _vertexArray;

_vertexArray 在标题中定义如下。这意味着当它在该方法中分配给数组时,引用计数将增加到 1。当引用被删除时,计数将变为 0 并删除该对象。

这意味着您不能依赖几何对象外部的数组数据,除非您还将数组定义为 ref_ptr。这非常令人困惑,让我想知道为什么他们没有将参数设置为 ref_ptr。

我确信这会导致一些难以理解的问题,但我想如果你要传递它,规则是不要依赖非引用指针。这可能适用于您盲目创建对象并立即将其传递给方法的情况,但我希望 OSG 能更清楚地说明这一点。

关于c++ - OpenSceneGraph 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28757903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com