13

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

1 个块中的 22,080(24 个直接,22,056 个间接)字节在 6 个丢失记录 6 中肯定丢失了
   在 0x4C2C7A7:操作员 new(无符号长)(在 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 中)
   通过 0x4A64FB: VectorBasedNodeOrder::VectorBasedNodeOrder(VectorBasedNodeOrder const&) (VectorBasedNodeOrder.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
{
}

你能解释一下为什么以及如何发生内存泄漏吗?

4

1 回答 1

29

根据您的评论,原始Node指针在其他地方进行管理,而不是问题,我将采取野蛮刺伤NodeOrder或进一步的父级没有虚拟析构函数,并且当您VectorBasedNodeOrder被基类指针以多态方式销毁时,孩子destructor 永远不会被调用,导致unique_ptr永远不会被破坏。

于 2013-06-28T04:19:35.940 回答