1 / 1 / 0
Регистрация: 08.05.2009
Сообщений: 16
|
|||||||||||
1 | |||||||||||
После компиляции VS2008 падает после удаления узла дерева, имеющего потомка24.05.2009, 17:16. Просмотров 4092. Ответов 36
Метки нет Все метки)
(
Вот код на Си:
в борладне все работает. Под *nix системами после компиляции gcc и в win после компиляции VS2008 падает после удаления узла дерева, имеющего потомка. Не могу разобраться почему, вроде все корректно выделяю, да и free передаю тот же адрес, что выделил мне malloc. Помогите разобраться, пожалуйста. Выделю место, где программа падает, на всякий:
0
|
|
24.05.2009, 17:16 | |
Удаление узла имеющего одного потомка
После удаления Avast'а система не запускается, падает в BSOD
|
|
1 / 1 / 0
Регистрация: 08.05.2009
Сообщений: 16
|
|
24.05.2009, 17:27 [ТС] | 3 |
спасибо за дельный совет, конечно, но, прежде чем написать на форум, я отлаживал её около часа. Да и читать мой пост нужно внимательней, я же написал:
0
|
![]() ![]() |
|||||||||||
24.05.2009, 17:50 | 4 | ||||||||||
![]() Решение
Алгоритмически удаляешь вроде бы правильно. free будет ломаться на исполнении, если ты его уже пытался удалить, или если затёр какую-либо служебную информацию. Собственно есть две идеи
1. Перед всеми free поставь печать того, что удаляешь и глазами убедись, что один и тот же узел два раза не удаляется. 2. После каждого вызова malloca поставь печать того, что вернул malloc, а так же значения по адресам на 8 меньшим, чем это значение (там обычно хранится служебная информация). Т.е. грубо говоря вместо "p = malloc(...);" в каждом месте напиши
0
|
1 / 1 / 0
Регистрация: 08.05.2009
Сообщений: 16
|
|
24.05.2009, 18:02 [ТС] | 6 |
попрошу без оскорблений "пустой набиватель постов"
![]() я же тебе русским языком говорю, дебагал программу в борланде и студии. По адресу, который передается free находится объект, который до этого был выделен malloc'ом. Если не можешь помочь, не пиши, пожалуйста, глупые посты. Evg, спасибо, сейчас попробую
0
|
Почетный модератор
7336 / 2601 / 270
Регистрация: 29.07.2006
Сообщений: 13,588
|
|
24.05.2009, 18:33 | 10 |
Ты ошибаешься. У тебя будет выдана ошибка при попытке, например, вызвать метод. В VS так вроде было... По крайне мере, если ошибки не будет при выполнении, в дебагере ошибку увидеть полубому можно.
Я уже не говорю о возможности gcc вывода "double free corruption", когда одна область два раза освобождается, прямо на терминал, даже принтфоф не нужно. Т. о., то, что память уже освобождена будет видно не вооруженным глазом в случае с gcc, к примеру. Хотя обратиться к методу и можно.
0
|
![]() ![]() |
||||||
24.05.2009, 18:42 | 11 | |||||
Не очень понимаю, как к данному примеру на Си относятся методы, но тем не менее. Вызов метода вообще не зависит от того, валидный указатель или нет
Код
$ g++ a.c && ./a.out trampampam trampampam trampampam trampampam
0
|
![]() ![]() |
|
24.05.2009, 19:02 | 17 |
Ты туверждал, что после free вообще с указателем делать ничего нельзя
Я тебе сказал, что зависит от реализации. Далее Я тебе выдал пример, в котором обращаюсь к методу через освобождённый/битый указатель. То, что из-под glibc пишется, что free вызван второй раз - далеко не факт, что в той версии библиотеки, которую использует автор (и наверняка это под виндой), будет то же самое. Потому и разжевал товарищу, как визуально отследить всю работу с динамической памятью Добавлено через 1 минуту 13 секунд Блин, что-то я не обратил снимание, что раздел "С++ для линукса" В любом случае мои возражения остаются в силе - не факт, что на его версии glibc было бы то же самое
0
|
Почетный модератор
7336 / 2601 / 270
Регистрация: 29.07.2006
Сообщений: 13,588
|
|
24.05.2009, 19:10 | 18 |
Добавлено через 1 минуту 9 секунд Добавлено через 44 секунды Да и вообще. Я не видел сообщения об ошибке, которое ему пишется.
0
|
![]() ![]() |
|
24.05.2009, 19:11 | 19 |
Я не понимаю эту фразу. Соотвественно не понимаю первые две цитаты из поста #17
Что ты этим хотел сказать? Добавлено через 33 секунды А ещё лучше на примере (на пальцах) - так проще понять будет
0
|
инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
|
|
24.05.2009, 19:12 | 20 |
Evg, объясните, пожалуйста, почему после 27 строки ( p = NULL) все равно вызывается метод?
0
|
24.05.2009, 19:12 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Ошибка компиляции после удаления файла в проекте в NetBeans C++ Алгоритм удаления узла из бинарного дерева Удаления узла из бинарного дерева поиска Вершина бинарного дерева: Как на рисунке будут выглядеть деревья до и после удаления? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |