Форум программистов, компьютерный форум CyberForum.ru

Ошибка при освобождении памяти? - C++

Восстановить пароль Регистрация
 
Kleerofski
Сообщений: n/a
08.11.2011, 12:46     Ошибка при освобождении памяти? #1
Доброго времени суток!

Я только-только взялся за изучение c++. Дошел до динамической памяти (разбираю по учебнику) и столкнулся с непонятной мне ошибкой при обнулении указателя. Подскажите, пожалуйста, в чем дело.
Миниатюры
Ошибка при освобождении памяти?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 12:46     Ошибка при освобождении памяти?
Посмотрите здесь:

C++ Ошибка при освобождении памяти
Ошибка при освобождении памяти C++
Ошибка при освобождении памяти C++
Ошибка при освобождении памяти C++
Ошибка при освобождении памяти массива char* C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
08.11.2011, 12:53     Ошибка при освобождении памяти? #2
строчка cout << *vk<<"\n";

*vk - это обращение к памяти, на которую указывает указатель.
Но он у вас в этот момент уже никуда не указывает.

Нельзя получить значение несуществующей переменной.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
08.11.2011, 13:03     Ошибка при освобождении памяти? #3
Цитата Сообщение от Bers Посмотреть сообщение
*vk - это обращение к памяти, на которую указывает указатель.
Но он у вас в этот момент уже никуда не указывает.
ну почему, в тот момент vk указывало на 0. Но нуль не является валидным адресом (по которому можно совершать разыменование).
2 ТС: похоже, ты не понимаешь смысл строчек, которые идут после строчки "delete ..."
Bers
Заблокирован
08.11.2011, 13:03     Ошибка при освобождении памяти? #4
Цитата Сообщение от Nameless One Посмотреть сообщение
ну почему, в тот момент vk указывало на 0. Но нуль не является валидным адресом (по которому можно совершать разыменование).
Ну как бы... "указывать на ноль", и "не указывать никуда" - суть одно и тоже.
Поэтому, ноль и не является валидным адресом
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
08.11.2011, 13:12     Ошибка при освобождении памяти? #5
Цитата Сообщение от Kleerofski Посмотреть сообщение
столкнулся с непонятной мне ошибкой при обнулении указателя
ошибка произошла не потому, что ты обнулил указатель, а потому, что ты попытался получить значение, (гипотетически) хранящееся по адресу 0. Но даже если не обнулять указатель, то действия, которые ты совершал после "delete ..." - неправильны, так как ты попытался получить значение, которое (после использования delete) уже не существует. В этом случае ты получишь неопределенное поведение программы. В лучшем случае программа упадет, а в худшем будет продолжать работать, используя неверное значение. Как раз чтобы не допустить такого поведения, считается хорошей практикой после удаления указателя присваивать ему значение 0, т.к. попытка разыменовать указатель по адресу 0 гарантированно приведет к краху программы в процессе выполнения
Kleerofski
Сообщений: n/a
08.11.2011, 19:06     Ошибка при освобождении памяти? #6
Понял, спасибо большое! Сейчас объяснение кажется вполне очевидным.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.11.2011, 20:21     Ошибка при освобождении памяти? #7
Цитата Сообщение от Bers Посмотреть сообщение
Ну как бы... "указывать на ноль", и "не указывать никуда" - суть одно и тоже.
Например под ДОСом ноль вполне валидный адрес, если мне не изменяет память, там лежит начало таблицы векторов прерываний, а конкретно по нулевому адресу находится адрес обработчика ошибки деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). Есть такой древний боян:
Assembler
1
2
xor ax, ax
mov [ax], ax
Это я к тому что "указывать на ноль", и "не указывать никуда" - это не одно и то же.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2011, 20:24     Ошибка при освобождении памяти?
Еще ссылки по теме:

C++ Ошибка при освобождении памяти (delete)
C++ Ошибка при освобождении памяти
Ошибка при освобождении памяти C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
08.11.2011, 20:24     Ошибка при освобождении памяти? #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это я к тому, что " "указывать на ноль", и "не указывать никуда" " - это не одно и то же.
Ну может быть под ДОСом и можно было чего то там хранить под нулевым адресом, но что-то я про такое не слышал. И потом, одно дело ассма, и совсем другое с++

Я так понял, что по стандарту, если указатель равен нулл - значит он "выключен". Смотрит в никуда. И насколько я знаю, по новому стандарту выключенный указатель равен null_ptr

Правда я не знаю, чем null_ptr отличается от обычного нуля.

Что то типа того, что null_ptr нельзя сравнивать с обычными числовыми типами?
Ну типа... null_ptr имеет тип "указатель" Или как?

Стандарт мне читать очень тяжело, а нормального мануала на русском по этой теме я не нашёл.

Если вы в курсе - можете просвятить?)
А я вам спасибо скажу )
Yandex
Объявления
08.11.2011, 20:24     Ошибка при освобождении памяти?
Ответ Создать тему
Опции темы

Текущее время: 09:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru