我最近开始使用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(这是有意义的),因为我们可以看到,当一个新的数组指针被分配时,它会盲目地覆盖最后一个数组指针。这很好,但是现在用户必须确保他们分配的数组比几何学类的寿命更长。另外,对于每个用户给这个几何图形对象的数组,他们必须保持对这个数组的引用。
这给我们留下了大量荒谬的指针,必须在删除对象之后才能删除。其结果是,我发现这非常麻烦的使用。我是不是漏掉了什么?为什么这个系统是这样设计的?
发布于 2015-02-27 05:29:26
osg::ref_ptr<Array> _vertexArray;_vertexArray是在标题中定义的,如下所示。这意味着当它在该方法中分配给数组时,引用计数将增加到1。当引用被移除时,计数将变为0,并将删除该对象。
这意味着,除非还将数组定义为ref_ptr,否则不能依赖几何对象之外的数组数据。这让我很困惑,我想知道为什么他们没有参数是ref_ptr。
我确信这会导致一些模糊的问题,但我想如果您要传递它,则不依赖于非引用指针。这可能是指在您盲目创建对象并立即将其传递给方法的情况下,尽管我希望OSG能够更清楚地说明这一点。
https://stackoverflow.com/questions/28757903
复制相似问题