Heap-use-after-free при неправильном назначении указателей во время инверсии двоичного дерева [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Heap-use-after-free при неправильном назначении указателей во время инверсии двоичного дерева [закрыто]

Сообщение Anonymous »

Я пытался решить вопрос об инверсии двоичного дерева в Leetcode

https://leetcode.com/problems/invert-binary-tree/
Я придумал это решение

Код: Выделить всё

TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) {
return root;
}
root -> left = invertTree(root -> right);
root -> right = invertTree(root -> left);
return root;
}
Теперь я понимаю логическую ошибку в моем коде. Как только я инвертирую root -> right и назначаю его root -> left, я теряю исходный корень -> left.

На втором этапе, когда я инвертирую root -> left, я инвертирую обратно то, что ранее инвертировал на последнем шаге.
Хотя логический недостаток понятен, я пытаюсь понять, почему я получил эту ошибку во время выполнения

Код: Выделить всё

==22==ERROR: AddressSanitizer: heap-use-after-free on address 0x5030000000d8 at pc 0x55b911822bb3 bp 0x7ffc24fc5710 sp 0x7ffc24fc5708
READ of size 8 at 0x5030000000d8 thread T0
#0 0x55b911822bb2 in __TreeNodeUtils__::freeTreeHelper(TreeNode*) (solution+0x1abbb2)
#1 0x55b911822b84 in __TreeNodeUtils__::freeTreeHelper(TreeNode*) (solution+0x1abb84)
#2 0x55b911822afa in __TreeNodeUtils__::freeTree(TreeNode*&) (solution+0x1abafa)
#3 0x55b911800071 in main solution.cpp:63:9
Я каким-то образом ссылался на указатель, который был удален/освобожден? Я пытался использовать ИИ, чтобы получить ответ, но это не очень помогло

Подробнее здесь: https://stackoverflow.com/questions/798 ... tree-inver
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»