我正在为我所在的项目制作一个节点编辑器,我有一个Node
共享指针的std::向量,这个类派生了不同节点类型的类。
正如我所说,这是一个共享指针的向量(我正在尝试智能指针,所以在这方面我有点新手(,当我创建一个节点时,下一个代码被执行:
DerivedNodeClass* d_node = new DerivedNodeClass();
nodes.push_back(std::make_shared<Node>((Node*)d_node);
所以这很好,但我想知道创建节点的方式是否导致了内存泄漏或类似的情况,因为我不确定这是否是一个"错误";适当的方式";创建类并将它们添加到智能指针向量中。
在我停止使用节点之后,我只是迭代调用.reset()
的向量,但我仍然不确定我做得是否正确。
注意,Node
的任何派生类都处理任何指针,或者不处理与动态内存相关的任何内容。
正如您所知,共享指针会在最后一个共享指针停止指向数据时自行删除它们所指向的数据(最后一个引用被销毁-共享指针会保存存储在内存中的关于有多少共享指针指向该数据的信息(。
在使用共享指针时,内存泄漏问题的唯一方法是,例如,将class Wrapper
作为class Node
实例的容器,其中存储在类Wrapper中容器中的每个节点都有一个对Wrapper类的引用(作为shared_ptr(,并且从其他位置有一个指向Wrapper实例的shared_ptr(从之前创建实例的位置(。这意味着Wrapper类的实例指向Node类的实例,同时Node类的例子指向Wrapper类别的实例,并且还有另一个指向Wrappeer类别实例的指针。(我试着在这里画一个草图:在销毁之前,销毁后,它帮助我理解了智能指针(
当您尝试为Wrapper类调用析构函数时,它会从创建位置删除shared_ptr,但容器中的每个Node实例都指向Wrapper实例。您正试图破坏的Wrapper类的实例仍然存在shared_ptr。这意味着shared_ptr中存在对此Wrapper类实例的引用,因此销毁此实例将导致内存泄漏。
如果你想解决这个问题,你应该检查弱指针(https://en.cppreference.com/w/cpp/memory/weak_ptr)。希望我能帮上忙。