【发布时间】:2017-06-11 09:33:02
【问题描述】:
每当我的对象的向量被重新分配时,都会调用对象的析构函数,这会给我带来问题。
struct Object
{
Object(int buffer_ID) : buffer_ID(buffer_ID){ OpenGLCreateBuffer(buffer_ID, somedata);}
~Object() { OpenGLDeleteBuffer(buffer_ID); }
int buffer_ID;
};
int main()
{
std::vector<Object> objArr;
objArr.push_back(1);
objArr.push_back(2); // Destructor is called when reallocating vector
OpenGLDrawBuffer(objArr[0].buffer_ID); // The buffer has been deleted
}
这真的很烦人,我不明白为什么要对正在移动的对象调用析构函数。我环顾四周,我很满意你不能停止调用析构函数。使用移动语义,我认为使用的技巧是从另一个对象复制内容,并将任何指针设置为 null,以便在它们上调用析构函数并释放资源时,只会在 nullptr 上调用 delete。
我首先尝试创建一个复制构造函数,并尝试将另一个 buffer_ID 设置为 0,但这仅在复制构造函数采用非常量引用时才有效,这似乎不正确。此外,将其他变量设置为 null 以便然后在 null 上调用 delete 的行为,或者将 null 传递给类似于在这种情况下的 OpenGL 删除函数之类的东西,这看起来很 hacky,不是吗?
我知道我会被告知我无法阻止析构函数被调用,那么在对象可能被重新分配到另一部分的情况下我应该怎么做?我认为析构函数是删除此类内容的最佳位置。
谢谢。
【问题讨论】:
-
让你的对象遵守“三法则”(或 C++11 中的“五法则”)。
-
最好有一个对象指针向量 std::vector
标签: c++ vector resources destructor release