Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Kleerofski
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 2
#1

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

08.11.2011, 12:46. Просмотров 842. Ответов 7
Метки нет (Все метки)

Доброго времени суток!

Я только-только взялся за изучение c++. Дошел до динамической памяти (разбираю по учебнику) и столкнулся с непонятной мне ошибкой при обнулении указателя. Подскажите, пожалуйста, в чем дело.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Ошибка при освобождении памяти
Задача: Из стандартного входного потока вводятся сроки. Признаком завершения...

Ошибка при освобождении памяти
#include <iostream> using namespace std; template<class T> class pvector...

Ошибка при освобождении памяти
Добрый День! Написал простую программу для понимания сути. Проблема в том, что...

Ошибка при освобождении памяти
Здравствуйте, программа завершает работу в этом коде #include <iostream>...

Ошибка при освобождении памяти
Здравствуйте! Пишу на MS Visual C++ 2010, windows 7. При вызове функции...

7
Bers
Заблокирован
08.11.2011, 12:53 #2
строчка cout << *vk<<"\n";

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

Нельзя получить значение несуществующей переменной.
1
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
08.11.2011, 13:03 #3
Цитата Сообщение от Bers Посмотреть сообщение
*vk - это обращение к памяти, на которую указывает указатель.
Но он у вас в этот момент уже никуда не указывает.
ну почему, в тот момент vk указывало на 0. Но нуль не является валидным адресом (по которому можно совершать разыменование).
2 ТС: похоже, ты не понимаешь смысл строчек, которые идут после строчки "delete ..."
1
Bers
Заблокирован
08.11.2011, 13:03 #4
Цитата Сообщение от Nameless One Посмотреть сообщение
ну почему, в тот момент vk указывало на 0. Но нуль не является валидным адресом (по которому можно совершать разыменование).
Ну как бы... "указывать на ноль", и "не указывать никуда" - суть одно и тоже.
Поэтому, ноль и не является валидным адресом
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
08.11.2011, 13:12 #5
Цитата Сообщение от Kleerofski Посмотреть сообщение
столкнулся с непонятной мне ошибкой при обнулении указателя
ошибка произошла не потому, что ты обнулил указатель, а потому, что ты попытался получить значение, (гипотетически) хранящееся по адресу 0. Но даже если не обнулять указатель, то действия, которые ты совершал после "delete ..." - неправильны, так как ты попытался получить значение, которое (после использования delete) уже не существует. В этом случае ты получишь неопределенное поведение программы. В лучшем случае программа упадет, а в худшем будет продолжать работать, используя неверное значение. Как раз чтобы не допустить такого поведения, считается хорошей практикой после удаления указателя присваивать ему значение 0, т.к. попытка разыменовать указатель по адресу 0 гарантированно приведет к краху программы в процессе выполнения
1
Kleerofski
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 2
08.11.2011, 19:06 #6
Понял, спасибо большое! Сейчас объяснение кажется вполне очевидным.
0
Kastaneda
Jesus loves me
Эксперт С++
4763 / 2966 / 342
Регистрация: 12.12.2009
Сообщений: 7,531
Записей в блоге: 2
Завершенные тесты: 1
08.11.2011, 20:21 #7
Цитата Сообщение от Bers Посмотреть сообщение
Ну как бы... "указывать на ноль", и "не указывать никуда" - суть одно и тоже.
Например под ДОСом ноль вполне валидный адрес, если мне не изменяет память, там лежит начало таблицы векторов прерываний, а конкретно по нулевому адресу находится адрес обработчика ошибки деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). Есть такой древний боян:
Assembler
1
2
xor ax, ax
mov [ax], ax
Это я к тому что "указывать на ноль", и "не указывать никуда" - это не одно и то же.
0
Bers
Заблокирован
08.11.2011, 20:24 #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это я к тому, что " "указывать на ноль", и "не указывать никуда" " - это не одно и то же.
Ну может быть под ДОСом и можно было чего то там хранить под нулевым адресом, но что-то я про такое не слышал. И потом, одно дело ассма, и совсем другое с++

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

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

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

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

Если вы в курсе - можете просвятить?)
А я вам спасибо скажу )
0
08.11.2011, 20:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2011, 20:24

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; #include &lt;stdlib.h&gt; #include...

Ошибка при освобождении памяти
Все идет замечательно, но вот когда происходит удаление массива программа...

Ошибка при освобождении памяти
Здравствуйте. Знаю, что тема уже много раз поднималась в самых разнообразных...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru