尽管使用unique_ptr,内存泄漏

时间:2013-06-28 04:09:19

标签: c++ memory-leaks unique-ptr

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

22,080 (24 direct, 22,056 indirect) bytes in 1 blocks are definitely lost in loss record 6 of 6
   at 0x4C2C7A7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
   by 0x4A64FB: VectorBasedNodeOrder::VectorBasedNodeOrder(VectorBasedNodeOrder const&) (VectorBasedNodeOrder.cpp:33)
   /* snip more trace */

这是涉嫌违规的代码,剥夺了所有不相关的内容:

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
{
}

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

1 个答案:

答案 0 :(得分:25)

根据您的注释,原始Node指针在其他地方进行管理,而不是问题我将采用NodeOrder或另一个父进程没有虚拟析构函数的狂野攻击,当基类指针以多态方式销毁VectorBasedNodeOrder时,永远不会调用子析构函数,导致unique_ptr永远不会被破坏。