2013-06-28 31 views
9

私は、そのクラスの内部でunique_ptrを渡す値を持つ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これも私の最初の考えでしたが、 'VectorBasedNodeOrder'インスタンスの警告も発行しないでください。そうではありませんが、これは唯一の「間違いなく失われた」警告です。 – Chris

+0

はい、そうです。その場合は別の警告が必要です。 (私はあなたが単にそれを見ていないと思っていたと思っていましたが、それはvalgrindの警告のリストにさらに下がるからです)。 – jogojapan

答えて

25

Nodeポインタは他の場所ではなく、私はNodeOrderまたはさらに親が仮想デストラクタを持っていないという野生の刺しを取るつもりだ、とあなたVectorBasedNodeOrderが多形に破壊されたときに、問題を管理されていることをあなたのコメントに基づいて、基本クラスポインタでは、子デストラクタは決して呼び出されず、unique_ptrは決して破壊されません。

+0

'NodeOrder'は実際には仮想デストラクタを持っていませんでした。もう一度テストを実行してお知らせします。 – Chris

+2

これは非常に洞察力のある答えです。私はほとんどそれにお金をかけるだろう。 – paddy

+0

仮説としては非常によく見えますが、あなたは野生の刺し棒で賭けを失うことになります。 – SChepurin

関連する問題