pol*_*ick 5 c++ boost memory-management
我目前正在使用opengl进入c ++进行低级编码.我来自一个沉重的objc背景,所以我对内存管理有一些了解,但我似乎无法得到"boost"库如何管理容器类型ptr_vector
.
我认为我的问题与我不知道如何ptr_vector
管理自身及其对象的破坏这一事实有关.
请看下面的代码:
// Header file
...
ptr_vector<IObject3D> objects;
...
// Implementation file
...
void ApplicationEngine::init()
{
WavefrontObject3D *object = new WavefrontObject3D("Ninja.obj");
objects.push_back(object);
}
...
Run Code Online (Sandbox Code Playgroud)
所以,对于实际问题:我是否通过"对象"变量在这里创建泄漏?
我习惯于使用objc中的显式调用手动保留和释放我的对象:之前我不得不alloc init
使用WavefrontObject3D object
,将其添加到数组中,然后release
将相同的对象添加到相同的对象中以避免泄漏.
但是当我delete object
在push_back
调用之后添加一个时,会调用WavefrontObject3D的解构object
函数.这给了我一个提示,ptr_vector
即不保留object
变量.我的假设是否正确?
另外但相关的问题:假设我想要销毁包含类ApplicationEngine
,我不必在ptr_vector
它管理的元素上调用某种解构函数吗?
不,这不会造成泄漏.ptr_*
当容器超出范围时,所有容器都将删除存储在其中的对象.
如果在将对象添加到容器后删除该对象,则会创建,undefined behavior
因为容器将尝试再次删除它.
附加问题:不,如果存储ptr_vector
by值,其生命周期由周围类的范围管理.
我们来写一个简单的实现ptr_vector
.它不支持间接迭代器和自定义删除器以及许多其他东西,但显示了使用的原则.
template <typename T>
class ptr_vector {
public:
// assume control over it
void push_back(T* x)
{ if(x) c_.push_back(x); else throw bad_pointer(); }
~ptr_vector() {
// delete everything that is stored here
for(auto x : c_) delete x;
}
private:
std::vector<T*> c_;
};
// a user class
struct user_class {
void addSomething() { x.push_back(new int(23)); }
ptr_vector<int> x;
};
Run Code Online (Sandbox Code Playgroud)
如果用户类超出范围,ptr_vector
将调用析构函数并回收所有内存.看不到泄漏.