我正在为我所在的项目制作节点编辑器,并且我有一个 std::vector 的共享指针Node
,该类具有不同节点类型的派生类。
正如我所说,这是一个共享指针向量(我正在尝试使用智能指针,所以在这方面我有点新手),当我创建一个节点时,将执行下一个代码:
DerivedNodeClass* d_node = new DerivedNodeClass();
nodes.push_back(std::make_shared<Node>((Node*)d_node);
所以这工作正常,但我想知道这种创建节点的方式是否会导致内存泄漏或类似的事情,因为我不确定这是否是创建类并将它们添加到智能指针向量中的“正确方式” .
在我停止使用节点后,我只是迭代了 vector 调用.reset()
,但仍然不确定我是否做得对。
请注意,任何派生类都Node
处理与动态内存相关的任何指针或任何内容。
您可能知道,共享指针会在最后一个共享指针停止指向数据时删除它们自己指向的数据(最后一个引用被销毁 - 共享指针保留有关存储在内存中的指向此数据的共享指针的数量的信息) .
使用共享指针时可能会遇到内存泄漏问题的唯一方法是,例如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] 删除。
我来说两句