Я создаю дерево динамических объектов. Класс Node имеет вектор для хранения дочерних узлов среди других переменных класса:
std::vector<Node*> child;
Деструктор класса удаляет все динамически размещенные переменные класса, а затем удаляет дочерние узлы:
~Node() {
//Deleting the other variables
.
.
.
//Deleting the child nodes
for(int i = 0; i < child.size(); i++) {
delete child[i];
}
}
В моем классе есть метод, создающий дерево заданной высоты, в котором текущий узел является корневым узлом:
void createTree(int height) {
if(height == 0) {
return;
}
for(int i = 0; i < numberOfChildNodes; i++) {
child.push_back(new Node());
child[i]->createTree(height - 1);
}
}
В этом классе есть еще один метод, в котором я создаю дерево с высотой = 3, затем удаляю все дерево и создаю другое с высотой = 4, затем удаляю все дерево и создаю дерево с высотой = 5 и так далее, пока не появится дерево. достигнут предел памяти:
void highestTreePossible() {
int i, height = 3;
struct sysinfo memInfo;
while(true) {
createTree(height);
sysinfo (&memInfo);
if(memInfo.freeram > limit) {
std::cout << "Highest tree possible: height = " << height;
break;
}
for(i = 0; i < child.size(); i++) {
delete child[i];
}
child.clear();
height++;
}
for(i = 0; i < child.size(); i++) {
delete child[i];
}
child.clear();
}
Проблема в том, что когда я проверяю память после запуска метода highTreePossible(), выделяется много памяти, чего быть не должно, потому что я все удалил. Почему в моем коде происходит утечка памяти?
std::unique_ptr
). - person Marek R   schedule 19.05.2020Node
на векторunique_ptr<Node>
. Нет причин заниматься управлением памятью самостоятельно. - person darcamo   schedule 19.05.2020