我不确定如何在我所拥有的情况下充分利用 RAII。这是这种情况:
我正在创建一个基本的渲染器。几何由 Geometry 类描述,该类可能添加了顶点。为了将几何对象用于渲染,必须首先对其进行编译(即将为几何创建一个 VBO)。几何对象的编译(和反编译)是通过渲染器对象完成的,一旦完成几何对象,就必须进行反编译。如果不进行反编译,就会出现内存泄漏。
这是我所描述的示例:
Renderer renderer; // the renderer object
{
Geometry geometry;
// add vertices
// and play around with material, etc.
if(!renderer.compile(geometery); // compile the geometery, so we can use it
{
cerr << "Failed to compile geometry!\n";
}
// now we can use it...
renderer.render(geometry, RenderType::TriangleStrips);
} // if I don't call renderer.decompile(geometry) here, I will get a leak
我要做的是反编译我的几何图形,而不明确告诉渲染器反编译它。这是为了简单地减少内存泄漏。我的第一个想法是使用 RAII,但如果我这样做,Geometry 类将需要 Renderer 类,这看起来很混乱。因为我需要一个对编译几何图形的渲染器对象的引用。
我想到的另一种选择是让渲染器创建几何图形,但这会导致动态分配几何对象(即使用new),而且看起来也很混乱。
我还想过在几何图形中放置一个句柄对象,例如将 unique_ptr 放在抽象句柄对象中。
例如
class GeometeryHandle
{
virtual ~GeometeryHandle() = 0;
};
这实际上可能有效,因为它也可以用于存储GLuint
手柄内。我不确定这是否合适,因为我可以直接通过渲染器引用简单地反编译几何。即如果我直接通过析构函数调用它,它会做同样的事情。
我应该如何适当地设计它,以免我不小心不反编译几何?