C에서는 RAII(Resource Acquisition Is 초기화)를 사용하여 리소스가 자동으로 해제될 때 자동으로 해제되도록 합니다. 더 이상 필요하지 않습니다. 이 패턴은 일반적으로 OpenGL 개체에 적용됩니다. 그러나 OpenGL 개체에 대해 RAII를 구현할 때 작동이 중지되는 문제가 발생하는 경우가 있습니다.
이러한 문제 중 하나는 OpenGL 개체 래퍼를 복사하거나 이동하려고 할 때 발생합니다. 기본적으로 C는 단순히 객체의 멤버를 복사하는 복사 생성자를 생성합니다. OpenGL 개체 래퍼의 경우 두 복사본 모두 동일한 OpenGL 개체를 참조합니다.
다음 코드를 고려하세요.
// An OpenGL object wrapper with RAII class BufferObject { public: BufferObject() { glGenBuffers(1, &buff_); } ~BufferObject() { glDeleteBuffers(1, &buff_); } private: GLuint buff_; }; // Vector of buffer objects vector<BufferObject> bufVec; { BufferObject some_buffer; // Create buffer object // Initialize some_buffer // Copy some_buffer into the vector bufVec.push_back(some_buffer); } // Error: bufVec.back() will reference a deleted object // Function returning a buffer object BufferObject InitBuffer() { BufferObject buff; // Create buffer object // Do stuff with buff // Return a copy of buff return buff; } // Error: The returned buffer will reference a deleted object auto buff = InitBuffer();
이 예에서는 some_buffer 복사본이 bufVec에 추가되고 InitBuffer()에서 반환된 버퍼는 모두 동일한 OpenGL 객체를 참조합니다. some_buffer가 범위가 끝날 때 소멸되면 OpenGL 객체가 삭제됩니다. 이로 인해 buffVec.back() 및 반환된 버퍼를 사용할 수 없게 되어 오류가 발생합니다.
이 문제를 해결하려면 OpenGL 개체 래퍼가 이동 전용 유형이어야 합니다. 이는 다음을 통해 달성할 수 있습니다:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!