Удалите ПУСТОЙ УКАЗАТЕЛЬ, но никакую ошибку компиляции

Я использую это:

SELECT * FROM `table` WHERE UNIX_TIMESTAMP(`datetime_field`) = 0
7
задан Mankarse 27 March 2012 в 21:28
поделиться

5 ответов

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

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

19
ответ дан 6 December 2019 в 08:44
поделиться

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

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

1
ответ дан 6 December 2019 в 08:44
поделиться

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

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

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

...
delete ptr;
ptr = NULL;
1
ответ дан 6 December 2019 в 08:44
поделиться

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

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

0
ответ дан 6 December 2019 в 08:44
поделиться

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

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

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

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

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

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

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

0
ответ дан 6 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: