尽管使用unique_ptr,但内存泄漏

Memory leak despite using unique_ptr

本文关键字:内存 泄漏 ptr unique      更新时间:2023-10-16

我有一个类的构造函数,它初始化该类内部的unique_ptr并将值传递给它。出于某种原因,valgrind抱怨内存泄漏:

1个块中的22080(24个直接,22056个间接)字节在丢失记录(共6个)中肯定丢失在0x4C2C7A7:运算符new(无符号长)(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)by 0x4A64FB:VectorBasedNodeOrder::VectorBasedNodeOrder(VectorBased NodeOrder const&)(Vectorbased NodeOrder.cpp:33)/*剪下更多痕迹*/

这是所谓的冒犯代码,去掉了所有无关的东西:

class VectorBasedNodeOrder : public NodeOrder
{
public:
    VectorBasedNodeOrder(const VectorBasedNodeOrder& order);
protected:
    std::unique_ptr<std::vector<Node*>> orderedNodes;
}
VectorBasedNodeOrder::VectorBasedNodeOrder(const VectorBasedNodeOrder& order):
NodeOrder(order),
orderedNodes(unique_ptr<std::vector<Node*>>(
    new std::vector<Node*>(*(order.orderedNodes)))) // <-- line 33
{
}

你能解释一下内存泄漏的原因和方式吗?

根据您的评论,即原始Node指针是在其他地方管理的,而不是问题所在,我要大胆地说,NodeOrder或其他父级没有虚拟析构函数,当您的VectorBasedNodeOrder被基类指针以多态方式破坏时,子析构函数永远不会被调用,导致unique_ptr永远不会被破坏。