У меня есть класс, который имеет 2 bools и массив указателей, которые я выделяю в куче. Проблема в том, что когда он вызывает деструктор, он выдает мне ошибку, вероятно, потому что он удаляет слишком много, я видел, что он пытался получить доступ 0x dddddd и показывает мне это «Исключение: нарушение прав чтения. Это было 0xDEEEDEEF.»
1.Как лучше использовать «удалить», это из-за перегрузки оператора?
2. Также говорится, что я не инициализировал «QuadTree :: childs», почему?
class QuadTree {
public:
QuadTree* childs[4];
bool info;
bool parent;
QuadTree() {
for (int i = 0; i < 4; ++i) {
childs[i]=NULL;
}
info = false;
parent = false;
}
~QuadTree() {
for (int i = 0; i < 4; ++i) {
delete childs[i];
}
}
QuadTree& operator=(const QuadTree& tree) {
for (int i = 0; i < 4; ++i) {
childs[i] = new QuadTree;
if (tree.childs[i]->parent == 1) {
childs[i] = tree.childs[i];
}
childs[i]->info = tree.childs[i]->info;
childs[i]->parent = tree.childs[i]->parent;
}
return *this;
}
}
Итак, это код для добавления двух деревьев. Я создал оператор перегрузки для Следующая причина, если узел одного дерева белый, а другое - родительский, я просто хочу скопировать родительский.
void addTrees(const QuadTree& tree1, const QuadTree& tree2, QuadTree& end) {
if (tree1.info == 1 || tree2.info == 1) {
end.info = 1;
return;
}
else if (tree1.parent == 1 && tree2.parent == 1) {
end.parent = 1;
for (int i = 0; i < 4; ++i) {
end.childs[i] = new QuadTree;
addTrees(*tree1.childs[i], *tree2.childs[i], *end.childs[i]);
}
}
else if (tree1.parent == 1) {
end.parent = 1;
end = tree1;
}
else if (tree2.parent == 1) {
end.parent = 1;
end = tree2;
}
else {
end.info = 0;
}
}