С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
0x0152
31 / 31 / 8
Регистрация: 23.03.2015
Сообщений: 210
#1

Вызов delete для нулевого указателя - C++

21.04.2016, 20:05. Просмотров 395. Ответов 10
Метки нет (Все метки)

Здравствуйте. Прочитал про конструктор переноса, в котором при копировании, необходимо обнулить все указатели, чтобы при удалении временного объекта не удалились данные. Получается что в деструкторе вызывается delete для нулевого указателя.
Это вообще корректно? или чего-то не понимаю?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2016, 20:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов delete для нулевого указателя (C++):

Null или 0 для нулевого указателя - C++
Здравствуйте. Появился вопрос что использовать лучше для создания нулевого указателя null или 0?

Обнаружением нулевого указателя - C++
Делаю алгоритм Хаффмана. Возникла проблема при построении таблицы соответствий. void MakeT (Node* root){ if(root->L!=NULL)...

Разыменование нулевого указателя - C++
Как вообще по стандарту ведет себя программа после разыменования нулевого указателя? Указано-ли это явно? Просто сегодня на работе...

delete указателя - C++
valueOfWordS - указатель, член класса String_value, конструктору же этого класса передается указатель на переменную того же типа: ...

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

Бинарные деревья. Ошибка нулевого указателя - C++
При выполнении программы возникла следующая ошибка: ptr было nullptr. Что это значит и как ее исправить?Возникает в функции make в цикле...

10
SergioO
95 / 184 / 63
Регистрация: 13.12.2015
Сообщений: 992
21.04.2016, 20:24 #2
0x0152, если ничего не путаю, то нормально.
C++
1
2
3
4
5
6
int main(){
int* p1 = new int;
p1 = 0;
delete p1;
return 0;
}
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3969 / 2193 / 553
Регистрация: 18.10.2014
Сообщений: 3,804
21.04.2016, 20:30 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 0x0152 Посмотреть сообщение
Получается что в деструкторе вызывается delete для нулевого указателя.
Во-первых, что там у вас происходит в деструкторе - зависит от вашего деструктора. Если вам не хочется вызывать delete для нулевого указателя - не вызывайте.

Во-вторых, delete для нулевого указателя всегда было разрешенной операцией. Такое delete просто ничего не делает.

В-третьих, это вообще де-факто стандарт для многих функций освобождения ресурсов - если им на вход передается нулевой указатель (или хэндл), то они просто ничего не делают. Так работает delete, так работает free и многие другие функции аналогичного толка.
3
0x0152
31 / 31 / 8
Регистрация: 23.03.2015
Сообщений: 210
21.04.2016, 20:32  [ТС] #4
TheCalligrapher, Спасибо. Почему-то считал всегда что delete для нулевого, вызовет ошибку т.к. попытается удалить память по нулевому адресу.
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,259
21.04.2016, 21:46 #5
Цитата Сообщение от 0x0152 Посмотреть сообщение
Почему-то считал всегда что delete для нулевого, вызовет ошибку т.к. попытается удалить память по нулевому адресу.
это free, по моему, вызовет ошибку, хотя могу ошибаться давно стандарт не смотрел
нулевого адреса не существует для языка, NULL отсутствие адреса
т.е
C++
1
2
if(a!=NULL)
 delete a;
тавтология
достаточно просто
C++
1
delete a;
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
21.04.2016, 21:49 #6
Цитата Сообщение от ValeryS Посмотреть сообщение
это free, по моему, вызовет ошибку
Нет, не вызовет
0
GbaLog-
21.04.2016, 21:49
  #7

Не по теме:

SergioO, Вы в простеньком примере допустили утечку памяти, стыдитесь!

0
SergioO
95 / 184 / 63
Регистрация: 13.12.2015
Сообщений: 992
21.04.2016, 22:07 #8
так, для сведения в Си NULL есть ((void*)0)

Добавлено через 11 минут
GbaLog-, да ну ))
задача была показать что можно нуль-пойнтер удалить.
буквально следующей строкой программа прекращала свою работу и память освобождалась. вот бы еще в таком примере я б не заботился об утечке ))
вот в Java - только new и никаких тебе delete!
можно, конечно, и обертки прикрутить для указателей... но зачем?
так что не стыдно )
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,259
21.04.2016, 22:30 #9
Цитата Сообщение от SergioO Посмотреть сообщение
в Си NULL есть ((void*)0)
а в плюсах просто 0
C++
1
#define NULL    0
VS2008 afx.h
C++
1
2
#undef NULL
#define NULL 0                   /* see <stddef.h> */
Keil stdlib.h
C++
1
2
3
#ifndef NULL
#define NULL 0
#endif
CVAVR string.h
и что?
то что NULL реализован через 0 ни о чем не говорит
не может менеджер памяти выделить память по адресу 0

Добавлено через 6 минут
вот еще
C++
1
2
3
4
5
6
7
#ifndef NULL
# ifdef __cplusplus
#  define NULL  0
# else
#  define NULL  ((__malloc_ptr_t) 0)
# endif
#endif
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3969 / 2193 / 553
Регистрация: 18.10.2014
Сообщений: 3,804
21.04.2016, 22:52 #10
Цитата Сообщение от SergioO Посмотреть сообщение
так, для сведения в Си NULL есть ((void*)0)
Не "есть", а "может быть".

В С NULL может быть 0, 0L, (2 - 2), (sizeof(char) - 1) и т.п., а также эти выражения, приведенные к типу void *. Так уж повелось, что наиболее популярным вариантом является ((void *) 0), но тем не менее такое определение NULL не гарантируется.
0
GbaLog-
Любитель чаепитий
3074 / 1413 / 341
Регистрация: 24.08.2014
Сообщений: 5,017
Записей в блоге: 1
Завершенные тесты: 2
22.04.2016, 10:19 #11
SergioO, Тогда бы просто так написали.
C++
1
2
int* p = 0;
delete p;
0
22.04.2016, 10:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2016, 10:19
Привет! Вот еще темы с ответами:

почему не происходит разыменования нулевого указателя? - C++
вот думаю, почему сия конструкция не вылетает: #define offsetof(type, member) (size_t)(&amp;(((type*)nullptr)-&gt;member))... видимо не происходит...

Удалит ли delete[] после измения типа указателя - C++
... double *pd = new double; char *pc = (char*)pd; delete pc; ... Меня интерисует что сделает delete pc? Спасибо.

вызов метода у указателя на указатель на класс - C++
Доброго времени суток! Простите за, возможно, глупый вопрос и/или его неточную формулировку, но вот что есть: class parent { ...

Вызов виртуального метода базового класса из указателя производного - C++
Допустим есть такой код: #include &lt;iostream&gt; class Base { public: virtual void f() { std::cout &lt;&lt; &quot;Base\n&quot;; } ...


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

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

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