首頁 > 後端開發 > C++ > 在 C 中使用 RAII 時如何避免 OpenGL 錯誤?

在 C 中使用 RAII 時如何避免 OpenGL 錯誤?

Susan Sarandon
發布: 2024-11-25 22:14:11
原創
1043 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板