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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kleerofski
Сообщений: n/a
#1

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

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

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

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

Ошибка при освобождении памяти - C++
#include <iostream> using namespace std; #include <stdlib.h> #include <fstream> #include <stdio.h> void *malloc (size_t...

Ошибка при освобождении памяти - C++
Задача: Из стандартного входного потока вводятся сроки. Признаком завершения каждой сроки является символ ‘\n’. Признаком конца текста...

Ошибка при освобождении памяти - C++
#include <iostream> using namespace std; template<class T> class pvector { T **p; int sz; public:

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

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

Ошибка при освобождении памяти - C++
Здравствуйте, программа завершает работу в этом коде #include <iostream> #include <ctime> #include <cmath> int main() { ...

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

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

Нельзя получить значение несуществующей переменной.
1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 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
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
08.11.2011, 13:12 #5
Цитата Сообщение от Kleerofski Посмотреть сообщение
столкнулся с непонятной мне ошибкой при обнулении указателя
ошибка произошла не потому, что ты обнулил указатель, а потому, что ты попытался получить значение, (гипотетически) хранящееся по адресу 0. Но даже если не обнулять указатель, то действия, которые ты совершал после "delete ..." - неправильны, так как ты попытался получить значение, которое (после использования delete) уже не существует. В этом случае ты получишь неопределенное поведение программы. В лучшем случае программа упадет, а в худшем будет продолжать работать, используя неверное значение. Как раз чтобы не допустить такого поведения, считается хорошей практикой после удаления указателя присваивать ему значение 0, т.к. попытка разыменовать указатель по адресу 0 гарантированно приведет к краху программы в процессе выполнения
1
Kleerofski
Сообщений: n/a
08.11.2011, 19:06 #6
Понял, спасибо большое! Сейчас объяснение кажется вполне очевидным.
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 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
Привет! Вот еще темы с ответами:

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

Ошибка при освобождении памяти - C++
Все идет замечательно, но вот когда происходит удаление массива программа крашится.. #include &lt;iostream&gt; using namespace std; ...

Ошибка при освобождении памяти (delete) - C++
Здравствуйте! Есть массив lines, созданный вот так : int *line = new int ; Потом, пытаюсь его удалить и пересоздать : delete...

Ошибка при освобождении памяти массива string - C++
Вот тут вот при delete возникает ошибка, и пишет &quot;The program ' Array Template.exe: Native' has exited with code 3 (0x3).&quot; template...


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

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

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