Удалить ключевое слово с ++ - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть класс, который имеет 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;
}


}

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Проблема в вашем операторе.

    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;
    }
};

В этих строках:

if (tree.childs[i]->parent == 1) {
    childs[i]->info = tree.childs[i]->info;
            childs[i]->parent = tree.childs[i]->parent;

childs[i] может быть nullptr, который подходит для назначения, но не подходит для Разыменование

1 голос
/ 25 апреля 2020

Строка childs[i] = tree.childs[i]; не выполняет то, что вы думаете.

Теперь вы ссылаетесь на выделенную память и больше не ссылаетесь на выделенную память. У любого, кто попытается удалить эту секунду памяти, будет плохое время.

Если вы хотите скопировать своего потомка в своего недавно выделенного потомка, вам нужно будет разыменовать указатель для работы с самим объектом. *childs[i] = *tree.childs[i]

...