ptr_vector如何管理内存?

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 objectpush_back调用之后添加一个时,会调用WavefrontObject3D的解构object函数.这给了我一个提示,ptr_vector即不保留object变量.我的假设是否正确?

另外但相关的问题:假设我想要销毁包含类ApplicationEngine,我不必在ptr_vector它管理的元素上调用某种解构函数吗?

pmr*_*pmr 6

不,这不会造成泄漏.ptr_*当容器超出范围时,所有容器都将删除存储在其中的对象.

如果在将对象添加到容器后删除该对象,则会创建,undefined behavior因为容器将尝试再次删除它.

附加问题:不,如果存储ptr_vectorby值,其生命周期由周围类的范围管理.

我们来写一个简单的实现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将调用析构函数并回收所有内存.看不到泄漏.