#c #class #delete-operator #garbage
#c #класс #удалить-оператор #мусор
Вопрос:
У меня есть класс node, который содержит 3 указателя на узел и 2 целых числа. Я выделяю все узлы с new
помощью, но когда я вызываю delete
их, целые числа устанавливаются -17891602
равными, и это портит остальную часть проверки границ моего кода. Что могло бы заставить delete
это сделать?
Комментарии:
1. Можете ли вы поделиться своим кодом.
2. Не видя некоторого кода, это трудно понять. Может быть, у вас ошибка в ваших деструкторах?
3. Почему вы проверяете содержимое памяти после того, как вы ее вызвали
delete
? Вы не должны этого делать.delete
не гарантирует запись чего-либо конкретного в ячейки памяти. Многие реализации delete намеренно записывают определенный мусор, чтобы помочь обнаружить ошибки, такие как доступ к памяти после вызоваdelete
.
Ответ №1:
После a delete
эта память больше не принадлежит вам. Не проверяйте его, ничего с ним не делайте, потому что, если вы это сделаете, у вас будет неопределенное поведение. Скорее всего, он скоро будет использован повторно.
Комментарии:
1. Просто добавлю, что многие компиляторы в отладочных сборках намеренно записывают мусор в освобожденную память, чтобы облегчить вам доступ к тому, чего у вас не должно быть.
2. Мне кажется, что yemathums говорит, что удаление элементов указателя узла изменяет целочисленные элементы. Он не проверяет удаленную память (насколько он знает).
Ответ №2:
Проверьте, получают ли поля указателей новые значения. Равны ли они 0xfeeefeee? (Это -17891602 в шестнадцатеричном формате.) Возможно, ваш диспетчер памяти перезаписывает освобожденную память, чтобы ее было легче распознать в аварийных дампах, когда вы пытаетесь прочитать или записать память, к которой у вас больше нет доступа.
Если вы читаете освобожденные объекты для проверки границ, то вы полагаетесь на неопределенное поведение. Проверьте документацию для вашей среды, чтобы узнать, что она делает с освобожденной памятью, если вообще что-либо делает. Ваша проверка границ должна будет сотрудничать с ней; вы не можете предположить, что это будет работать в общем случае.
Ответ №3:
Если вы разрабатываете и используете Linux gdb
, вы можете установить watch
контрольную точку, используя команду для GDB. Это может помочь определить, когда была перезаписана ячейка памяти.