我有一个在C++类中的OpenGL对象。由于我正在使用RAII,所以我想要在析构函数中删除它。因此我的类看起来像这样:
class BufferObject
{
private:
GLuint buff_;
public:
BufferObject()
{
glGenBuffers(1, &buff_);
}
~BufferObject()
{
glDeleteBuffers(1, &buff_);
}
//Other members.
};
这似乎可以工作。但是,每当我执行以下任何操作时,使用它时就会出现各种OpenGL错误:
vector<BufferObject> bufVec;
{
BufferObject some_buffer;
//Initialize some_buffer;
bufVec.push_back(some_buffer);
}
bufVec.back(); //buffer doesn't work.
BufferObject InitBuffer()
{
BufferObject buff;
//Do stuff with `buff`
return buff;
}
auto buff = InitBuffer(); //Returned buffer doesn't work.
发生了什么?
注:这是构建标准答案的尝试。
shared_ptr
的共享状态来自哪里?该共享状态必须动态分配,以便它可以被其他shared_ptr
实例共享,并且它需要能够比资源存在更长时间,以便weak_ptr
可以工作。shared_ptr
在其构造函数中为共享状态分配内存。这忽略了标准库中的每个容器,如果您传递要存储的数据,则所有容器都在其构造函数中分配。或者文件流,在其构造函数中打开文件等。 - Nicol Bolas