背景
在 C 中,RAII(资源获取即初始化)是用于确保自动资源清理。当一个对象超出范围时,它的析构函数被调用,释放它所拥有的所有资源。
问题
考虑一个带有通过 RAII 管理的 OpenGL 对象的 C 类:
class BufferObject { public: BufferObject() { glGenBuffers(1, &buff_); } ~BufferObject() { glDeleteBuffers(1, &buff_); } };
在某些场景下使用时,例如存储在向量中或从函数返回时,会出现问题OpenGL 错误。
分析
问题源于缺乏正确的复制/移动语义。当复制对象时(例如,push_back),仅复制成员变量,使两个对象具有相同的 OpenGL 缓冲区对象。销毁后,第一个对象会删除缓冲区,使第二个对象无效。
解决方案:实现移动语义
要解决此问题,应将该类转换为仅移动类型,删除复制构造函数和复制赋值运算符。相反,应提供移动构造函数和移动赋值运算符来转移资源的所有权:
class BufferObject { public: BufferObject(const BufferObject &) = delete; BufferObject &operator=(const BufferObject &) = delete; BufferObject(BufferObject &&other) : buff_(other.buff_) { other.buff_ = 0; } BufferObject &operator=(BufferObject &&other) { if (this != &other) { Release(); buff_ = other.buff_; other.buff_ = 0; } return *this; } };
这可确保在任何给定时间只有一个对象拥有 OpenGL 缓冲区。
以上是在 C 中使用 RAII 时如何避免 OpenGL 错误?的详细内容。更多信息请关注PHP中文网其他相关文章!