Что может привести к тому, что delete оставит мусорные значения в полях данных моего класса?

#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. Это может помочь определить, когда была перезаписана ячейка памяти.