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

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

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

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

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

Здравствуйте. Прочитал про конструктор переноса, в котором при копировании, необходимо обнулить все указатели, чтобы при удалении временного объекта не удалились данные. Получается что в деструкторе вызывается delete для нулевого указателя.
Это вообще корректно? или чего-то не понимаю?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SergioO
93 / 182 / 63
Регистрация: 13.12.2015
Сообщений: 986
21.04.2016, 20:24     Вызов delete для нулевого указателя #2
0x0152, если ничего не путаю, то нормально.
C++
1
2
3
4
5
6
int main(){
int* p1 = new int;
p1 = 0;
delete p1;
return 0;
}
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3635 / 1910 / 503
Регистрация: 18.10.2014
Сообщений: 3,477
21.04.2016, 20:30     Вызов delete для нулевого указателя #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 0x0152 Посмотреть сообщение
Получается что в деструкторе вызывается delete для нулевого указателя.
Во-первых, что там у вас происходит в деструкторе - зависит от вашего деструктора. Если вам не хочется вызывать delete для нулевого указателя - не вызывайте.

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

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

Не по теме:

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

SergioO
93 / 182 / 63
Регистрация: 13.12.2015
Сообщений: 986
21.04.2016, 22:07     Вызов delete для нулевого указателя #8
так, для сведения в Си NULL есть ((void*)0)

Добавлено через 11 минут
GbaLog-, да ну ))
задача была показать что можно нуль-пойнтер удалить.
буквально следующей строкой программа прекращала свою работу и память освобождалась. вот бы еще в таком примере я б не заботился об утечке ))
вот в Java - только new и никаких тебе delete!
можно, конечно, и обертки прикрутить для указателей... но зачем?
так что не стыдно )
ValeryS
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,641
21.04.2016, 22:30     Вызов delete для нулевого указателя #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
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3635 / 1910 / 503
Регистрация: 18.10.2014
Сообщений: 3,477
21.04.2016, 22:52     Вызов delete для нулевого указателя #10
Цитата Сообщение от SergioO Посмотреть сообщение
так, для сведения в Си NULL есть ((void*)0)
Не "есть", а "может быть".

В С NULL может быть 0, 0L, (2 - 2), (sizeof(char) - 1) и т.п., а также эти выражения, приведенные к типу void *. Так уж повелось, что наиболее популярным вариантом является ((void *) 0), но тем не менее такое определение NULL не гарантируется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2016, 10:19     Вызов delete для нулевого указателя
Еще ссылки по теме:
вызов метода у указателя на указатель на класс C++
Вызов виртуального метода базового класса из указателя производного C++
Почему при выводе указателя получаем для char - значение по адресу, а для других типов - адрес C++
C++ Delete [] для статического массива
operator << для указателя C++

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

Или воспользуйтесь поиском по форуму:
GbaLog-
Любитель чаепитий
2586 / 1125 / 279
Регистрация: 24.08.2014
Сообщений: 4,124
Записей в блоге: 1
Завершенные тесты: 2
22.04.2016, 10:19     Вызов delete для нулевого указателя #11
SergioO, Тогда бы просто так написали.
C++
1
2
int* p = 0;
delete p;
Yandex
Объявления
22.04.2016, 10:19     Вызов delete для нулевого указателя
Ответ Создать тему
Опции темы

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