我有一个类的构造函数,该类使用传递给它的值初始化该类内的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
{
}
能否请你解释为何以及如何发生内存泄漏?
对于'VectorBasedNodeOrder'对象本身的内存管理得当?如果该对象本身被泄露,valgrind不仅会为此发出警告,还会为其成员发出警告,包括'unique_ptr'。 – jogojapan
@jogojapan这也是我的第一个想法,但应该valgrind不会对'VectorBasedNodeOrder'实例发出警告吗?它不,这是唯一的“绝对失败”的警告。 – Chris
是的,没错,在这种情况下应该有另一个警告。 (我曾以为你根本就没有看这个,因为它可能会在valgrind警告列表中进一步下降。)但是Mark B在回答中刚刚说的可能是对此的解释。 – jogojapan