首页 >后端开发 >C++ >在 C 中使用 RAII 时如何避免 OpenGL 错误?

在 C 中使用 RAII 时如何避免 OpenGL 错误?

Susan Sarandon
Susan Sarandon原创
2024-11-25 22:14:111133浏览

How to Avoid OpenGL Errors When Using RAII in C  ?

解决 C RAII 类中的 OpenGL 对象问题

背景

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn