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