我目前正在使用 c++ 使用 opengl 进行较低级别的编码。我来自一个沉重的 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);
}
...
所以,对于实际问题:我是否通过“对象”变量在这里造成泄漏?
我习惯于通过 objc 中的显式调用来手动保留和释放对象:
以前我必须alloc init
WavefrontObject3Dobject
,将其添加到数组中,然后release
同一对象以避免泄漏。
但是当我添加一个delete object
之后push_back
调用 WavefrontObject3D 的解构函数object
叫做。这给了我一个暗示ptr_vector
不保留object
多变的。我的假设正确吗?
附加但相关的问题:假设我想销毁包含类ApplicationEngine
我不需要调用某种解构函数吗ptr_vector
或者它管理的元素?
不,这不会造成泄漏。全部ptr_*
当容器超出范围时,容器将删除存储在其中的对象。
如果将对象添加到容器后删除它,您将创建undefined behavior
因为容器将尝试再次删除它。
附加问题:不,如果您存储ptr_vector
根据值,它的生命周期由周围类的范围管理。
我们来写一个简单的实现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;
};
如果用户类超出范围,则析构函数ptr_vector
将要
被调用并且所有内存将被回收。看不到泄漏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)