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