C ++ пытается удалить двоичное дерево и переместить его в вектор - PullRequest
0 голосов
/ 25 апреля 2018

Итак, я пытаюсь написать функцию, которая помещает все значения двоичного дерева в вектор, который позже будет использоваться для его воссоздания.Но когда я пытаюсь вызвать эту функцию, я получаю сообщение об ошибке:

Error in `./bst': double free or corruption (fasttop):

Это функция, которую я использую.Сам вектор является частной переменной, содержащей узлы.size () возвращает размер дерева и работает.

void BST::swapvector()
{
    Node *ptr = m_root;
    while (size() != 0)
    {
        if (ptr->m_left != NULL) {
            ptr = ptr->m_left;
        } else if (ptr->m_right != NULL) {
            ptr = ptr->m_right;
        } else {
            Node *temp = ptr;
            myvector.push_back(ptr); //starting from root, we traverse until we reach the bottom and then add ptr to the vector
            ptr = m_root;
            delete temp; //once we're finished, we delete temp
        }
    }
}

Кто-нибудь знает, почему это не работает?Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Понятно, почему это не работает.

    } else {
        Node *temp = ptr;
        myvector.push_back(ptr); //starting from root, we traverse until we reach the bottom and then add ptr to the vector
        ptr = m_root;
        delete temp; //once we're finished, we delete temp
    }

Вы сохраняете указатель на Node в векторе, а затем удаляете этот Node с помощью delete temp.После этого указатель, сохраненный в векторе, указывает на мусор или несуществующую память.

"... функция, которая помещает все значения двоичного дерева в вектор ..." Нет, вы не храните значения двоичного дерева, вы сохраняете указатели на значения двоичного дерева (Node объекты).

Вы можете сделать две вещи:

  • Если двоичное дерево не будет ни освобождено, ни изменено в течение жизни myvector, тогда вы можете просто удалить строку delete temp;.
  • Если предположение в первом случае неверно,тогда вам нужно хранить Node элементы в векторе, , а не указатели на них.Итак, определите myvector как vector<Node> myvector; вместо vector<Node *> myvector; и измените myvector.push_back(ptr); на myvector.push_back(*ptr);.
0 голосов
/ 25 апреля 2018

Вы не можете удалить темп после того, как поместите его в вектор.Кроме того, как определяется ваш вектор?Там может быть проблема.

Также вы должны использовать итераторы вместо функции push_back ().Это не очень хорошо работает с указателями.

И почему все настаивают на использовании указателей в стиле c.Используйте общие или уникальные указатели.Пожалуйста?

Тип ошибки обычно означает, что указатель освобождается дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...