这种对共享指针向量的推回是否会导致内存泄漏?

卢乔苏亚

我正在为我所在的项目制作节点编辑器,并且我有一个 std::vector 的共享指针Node,该类具有不同节点类型的派生类。

正如我所说,这是一个共享指针向量(我正在尝试使用智能指针,所以在这方面我有点新手),当我创建一个节点时,将执行下一个代码:

 DerivedNodeClass* d_node = new DerivedNodeClass();
 nodes.push_back(std::make_shared<Node>((Node*)d_node);

所以这工作正常,但我想知道这种创建节点的方式是否会导致内存泄漏或类似的事情,因为我不确定这是否是创建类并将它们添加到智能指针向量中的“正确方式” .

在我停止使用节点后,我只是迭代了 vector 调用.reset(),但仍然不确定我是否做得对。

请注意,任何派生类都Node处理与动态内存相关的任何指针或任何内容。

z_domo

您可能知道,共享指针会在最后一个共享指针停止指向数据时删除它们自己指向的数据(最后一个引用被销毁 - 共享指针保留有关存储在内存中的指向此数据的共享指针的数量的信息) .

使用共享指针时可能会遇到内存泄漏问题的唯一方法是,例如class Wrapper当您将容器class Node中的每个节点存储在 Wrapper 类中的容器中的实例都具有对 Wrapper 类的引用(作为 shared_ptr)时从其他地方有一个 shared_ptr 指向 Wrapper 类的实例(从之前创建实例的地方)。这意味着 Wrapper 类的实例指向 Node 类的实例,同时 Node 类的实例指向 Wrapper 类的实例,并且还有另一个指向 Wrapper 类实例的指针。(我试着在这里为它画一个草图:在销毁之前在销毁之后,它帮助我理解智能指针)

当您尝试为 Wrapper 类调用析构函数时,它会从创建位置删除 shared_ptr,但容器中的每个 Node 实例都指向 Wrapper 实例。您正试图破坏的 Wrapper 类的实例仍然存在 shared_ptr 。这意味着 shared_ptr 中有一个对这个 Wrapper 类实例的引用,因此销毁这个实例会导致内存泄漏。

如果你想解决这个问题,你应该检查弱指针(https://en.cppreference.com/w/cpp/memory/weak_ptr)。希望我有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

清除共享指针向量后内存泄漏

为什么指向同一个内存的多个共享指针会导致内存泄漏?

为什么向向量添加智能指针会导致内存泄漏?

使用运算符 = 重新分配共享指针会导致内存泄漏?

这种关闭是否会导致Node.js中的内存泄漏,还是编程错误?

重定向指针会导致内存泄漏吗?

使用类的向量时是否会遇到内存泄漏?(C ++)

如果引用仍然存在,是否不会在析构函数中删除指针会导致内存泄漏?

不带挂断调用的ManuallyDrop是否会导致内存泄漏?

引用数组索引是否会导致内存泄漏?

BeginInvokeOnMainThread方法是否会循环并导致内存泄漏?

自定义ClassLoader是否会导致内存泄漏?

Android匿名asyncTask-是否会导致内存泄漏

这段代码是否会导致 JavaScript 内存泄漏

这个Java示例是否会导致内存泄漏?

Task.Delay()循环是否会导致内存泄漏?

调用创建对象的函数是否会导致内存泄漏?

分配函数作用域成员是否会导致内存泄漏?

调用解构函数时,这是否会导致内存泄漏?

将共享指针推回向量时发生错误

在Golang中推回向量会导致程序崩溃

从向量中删除值导致的内存泄漏

使用函数初始化静态向量会导致内存泄漏吗?

如果dom元素具有指向关闭的指针,那么如果我从页面中删除dom元素,是否会导致内存泄漏?

清空Array = []会导致内存泄漏吗?

Redux存储会导致内存泄漏吗?

该程序会导致内存泄漏吗?

goto LABEL会导致内存泄漏吗?

递归调用Ajax会导致内存泄漏?