次のコードがあります。
class Node {
public:
int data;
Node* parent;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
public:
explicit Node(int d) : data(d),
parent(nullptr),
left(nullptr),
right(nullptr) { }
/*
Some functions
*/
};
class dt {
private:
Node* root;
private:
void add_helper(Node* parent, Node* node);
/*
Some helper functions
*/
public:
dt() : root(nullptr) {}
~dt() {
delete root;
}
/*
Some functions
*/
void add(int data);
};
void dt::add(int data) {
if(!root) {
root = new Node(data); // 1: memory leak
return;
}
Node* node = new Node(data); // 2: memory leak
add_helper(root, node);
}
このコードをスキャンしてメモリ リークを探すと、Dr. Memoryは上記のコメントに記載されている行にエラーを表示します。しかし、それらは本当にメモリ リークなのでしょうか。dtには、ルートポインタが削除されるデストラクタがあります。デストラクタがルートノードの削除を開始すると、再帰的に実行され、すべての子が削除されます。それとも他に何かあるのでしょうか?