我最近开始使用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像这样在 header 中定义。这意味着当在该方法中将其分配给数组时,引用计数将增加为1。删除引用后,计数将变为0并删除对象。

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

我确定这会导致一些晦涩的问题,但是我想规则是如果您要传递的话,则不依赖非引用指针。这可能是针对您盲目创建对象并立即将其传递给方法的情况,尽管我希望OSG能够使这一点更加清楚。

09-07 07:38