C RAII 클래스의 OpenGL 개체: 함정 및 해결 방법
C RAII 클래스에서는 개체가 범위를 벗어나면 멤버가 자동으로 해제됩니다. 리소스 할당 해제를 보장합니다. 그러나 이러한 클래스에서 OpenGL 객체를 처리할 때 의도하지 않은 결과가 발생할 수 있습니다.
다음 코드를 고려하세요.
class BufferObject { private: GLuint buff_; public: BufferObject() { glGenBuffers(1, &buff_); } ~BufferObject() { glDeleteBuffers(1, &buff_); } // Other members };
이 클래스는 OpenGL 버퍼 객체를 관리하며, 오물 소각로. 그러나 이러한 객체를 복사하거나 이동 구성하려고 하면 예기치 않은 오류가 발생합니다.
이 문제는 명시적인 복사 또는 이동 생성자/할당 연산자가 없기 때문에 발생합니다. 컴파일러에서 생성된 복사 생성자는 단순히 멤버 변수를 복사하여 동일한 OpenGL 버퍼 객체를 공유하는 두 객체로 이어집니다. 한 객체가 소멸되면 다른 객체가 유효하지 않게 되어 오류가 발생합니다.
마찬가지로 InitBuffer 함수
BufferObject InitBuffer() { BufferObject buff; // Do stuff with `buff` return buff; }
도 버프가 반환 값에 복사된 후 소멸되기 때문에 실패합니다.
이러한 함정을 해결하려면 이동 전용 유형을 사용해야 합니다. C에서 이는 복사 생성자와 복사 할당 연산자를 삭제하는 동시에 소유권을 이전하는 이동 등가물을 제공하는 것을 의미합니다.
class BufferObject { private: GLuint buff_; public: BufferObject() { glGenBuffers(1, &buff_); } BufferObject(const BufferObject&) = delete; // no copy constructor BufferObject& operator=(const BufferObject&) = delete; // no copy assignment BufferObject(BufferObject&& other) : buff_(other.buff_) { other.buff_ = 0; } BufferObject& operator=(BufferObject&& other) { if(this != &other) { Release(); // release current resource buff_ = other.buff_; other.buff_ = 0; } return *this; } ~BufferObject() { Release(); } void Release() { if(buff_) glDeleteBuffers(1, &buff_); } // Other members };
이러한 변경을 통해 BufferObject 인스턴스 복사 및 이동이 안전해지고 OpenGL 리소스가 내에서 올바르게 관리됩니다. RAII 패턴.
위 내용은 C RAII 클래스 내에서 OpenGL 개체를 어떻게 안전하게 관리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!