13

渡された値を使用して、そのクラス内で unique_ptr を初期化するクラスのコンストラクターがあります。何らかの理由で、valgrind はメモリ リークについて不平を言います。

1 ブロックの 22,080 (直接 24、間接 22,056) バイトは、損失レコード 6/6 で確実に失われます
   at 0x4C2C7A7: operator new (unsigned long) (/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 内)
   by 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デストラクタは呼び出されないため、破壊されることはありunique_ptrません。

于 2013-06-28T04:19:35.940 に答える