gpt4 book ai didi

c++ - ptr_vector 是如何管理内存的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:23 25 4
gpt4 key购买 nike

我目前正在使用 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);
}
...

那么,对于真正的问题:我是不是通过“object”变量在这里制造了泄漏?

我习惯于在 objc 中通过显式调用手动保留和释放我的对象:以前,我必须alloc init WavefrontObject3D object,将其添加到数组中,然后release同一对象以避免泄漏。

但是当我在 push_back 调用之后添加一个 delete object 时,将调用 WavefrontObject3D object 的解构函数。这提示我 ptr_vector 没有保留 object 变量。我的假设是否正确?

附加但相关的问题:假设我想销毁包含类 ApplicationEngine 难道我不必在 上调用某种解构函数ptr_vector 还是它管理的元素?

最佳答案

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

如果在将对象添加到容器后将其删除,您将创建未定义的行为,因为容器将尝试再次删除它。

附加问题:不,如果您按值存储 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 的析构函数将被调用,所有内存将被回收。看不到泄漏。

关于c++ - ptr_vector 是如何管理内存的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com