私は、そのクラスの内部で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
{
}
なぜ、どのようにメモリリークが発生しますが、説明していただけます?
'VectorBasedNodeOrder'オブジェクト自体のメモリが適切に管理されていますか?そのオブジェクト自体が流出した場合、valgrindは警告だけを発行するだけでなく、メンバに対しても 'unique_ptr'を含む警告を発行します。 – jogojapan
@jogojapanこれも私の最初の考えでしたが、 'VectorBasedNodeOrder'インスタンスの警告も発行しないでください。そうではありませんが、これは唯一の「間違いなく失われた」警告です。 – Chris
はい、そうです。その場合は別の警告が必要です。 (私はあなたが単にそれを見ていないと思っていたと思っていましたが、それはvalgrindの警告のリストにさらに下がるからです)。 – jogojapan