Удалить NULL, но нет ошибки компиляции - PullRequest
7 голосов
/ 13 октября 2009

Я запутался, почему следующий код C ++ может компилироваться. Почему вызов удаления метода 0 не приводит к ошибке?!

int *arr = NULL;     // or if I use 0, it's the same thing      
delete arr;

Я попытался запустить его, и он не выдал мне никакой ошибки ...

Ответы [ 5 ]

19 голосов
/ 13 октября 2009

Язык C ++ гарантирует, что удаление p ничего не даст, если p равно NULL.

Для получения более подробной информации, ознакомьтесь с Разделом 16,8,9 здесь :

1 голос
/ 13 октября 2009

Это де-факто стандарт в языках Си и Си ++ (и не только в них), что процедуры освобождения ресурсов должны принимать аргументы нулевого указателя и просто ничего не делать. На самом деле, это довольно условное соглашение. Итак, настоящий вопрос здесь: почему это удивляет вас? Что заставляет вас думать, что это должно привести к ошибке? Более того, что заставляет вас думать, что он не сможет скомпилировать ???

Кстати, ваш вопрос, как он сформулирован, кажется, не имеет особого смысла, поскольку ваш код на самом деле не может компилироваться. В предполагаемом объявлении указателя отсутствует тип, который заставит любой компилятор выдавать диагностическое сообщение.

1 голос
/ 13 октября 2009

Вы можете без проблем удалить нулевой указатель, и ошибка, которая может / может возникнуть, будет не во время компиляции, а во время выполнения.

int *ptr_A = &a;
ptr_A = NULL;
delete ptr_A;

Обычно это удобно делать:

...
delete ptr;
ptr = NULL;
0 голосов
/ 13 октября 2009

Хотя ваш пример тривиален, компилятор не может узнать (во время компиляции) значение указателя.

Вы также можете разыменовать null во время компиляции:

// this code compiles
Object* pObject = 0;
pObject->SomeMethod();

Компиляторы не созданы для обработки таких типов ошибок во время компиляции.

И большинство (все?) Реализации имеют 'delete 0' как неоперацию. Этот код должен работать нормально:

Object* pObject = new Object();
delete pObject;
pObject = 0;
delete pObject;

Хотя я не уверен на 100%:)

0 голосов
/ 13 октября 2009

NULL и 0 не одно и то же. В C ++ вы должны использовать 0.

Нет ничего синтаксически неправильного или неоднозначного в удалении нулевого указателя. На самом деле, это по определению неоперация; то есть операция удаления 0-го адреса эквивалентна бездействию вообще.

...