2013-06-28 85 views
9

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

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

对于'VectorBasedNodeOrder'对象本身的内存管理得当?如果该对象本身被泄露,valgrind不仅会为此发出警告,还会为其成员发出警告,包括'unique_ptr'。 – jogojapan

+0

@jogojapan这也是我的第一个想法,但应该valgrind不会对'VectorBasedNodeOrder'实例发出警告吗?它不,这是唯一的“绝对失败”的警告。 – Chris

+0

是的,没错,在这种情况下应该有另一个警告。 (我曾以为你根本就没有看这个,因为它可能会在valgrind警告列表中进一步下降。)但是Mark B在回答中刚刚说的可能是对此的解释。 – jogojapan

回答

25

基于您的评论的原料Node指针在其他地方管理,而不是我要采取野生刺是NodeOrder或进一步父母没有虚析构函数的问题,当你VectorBasedNodeOrder被摧毁多态通过基类指针,子析构函数从不被调用,导致不会被破坏。

+0

'NodeOrder'确实没有虚拟析构函数。将再次运行测试并通知您。 – Chris

+2

这是一个非常有见地的答案。我几乎把钱放在上面。 – paddy

+0

虽然它看起来很不错,但你会失去对野生刺刀的投注。 – SChepurin