배경
C에서 RAII(Resource Acquisition Is 초기화)는 자동 리소스 정리를 보장하기 위해 사용됩니다. 객체가 범위를 벗어나면 해당 소멸자가 호출되어 보유하고 있는 모든 리소스를 해제합니다.
문제
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!