Как проверить неверный указатель?

Мой текущий код в действии:

if( objectPointer != NULL){
    delete objectPointer;
}

не работает, потому что указатели получают компилятором недопустимые шестнадцатеричные числа, такие как:

  • 0xbaadf00d
  • 0xDEADBEEF

и т.д....

Итак, что лучший способ проверить недопустимый указатель перед попыткой удалить объект?

Ответ 1

Всегда начинайте свои указатели с NULL (то есть 0). Из http://www.lysator.liu.se/c/c-faq/c-1.html:

Нулевой указатель концептуально отличается от неинициализированного указателя. Известно, что нулевой указатель не указывает на какой-либо объект; неинициализированный указатель может указывать куда угодно.

Ответ 2

При вызове delete вам не нужно проверять не-NULL. Он явно определен, чтобы ничего не делать.

delete NULL; // this is allowed

Любой правильный код, который вы пишете, не будет затронут этими странными значениями, которые компилятор помещает в вашу неинициализированную или уже освобожденную память. Он ставит эти значения там, чтобы помочь вам найти ошибки. Ergo, у вас есть ошибка.

Ответ 3

Лучший способ - установить его в NULL, если он не указывает на что-либо. Глобалы, указатели в других пространствах имен и локальные статические указатели автоматически инициализируются как нулевые указатели. Члены класса и нормальные локальные жители должны быть инициализированы в NULL вручную, если вам нужно протестировать их против NULL (некоторые люди предпочитают использовать 0. Конечно, это полностью эквивалентно).

Затем вы можете проверить NULL, но также можете передать указатель сразу на delete, потому что он не будет иметь никакого эффекта для удаления нулевого указателя (гарантируется стандартом С++).

Ответ 4

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

Ответ 5

Лучший способ "проверить недопустимый указатель перед попыткой удалить объект" - никогда не пытаться удалить объект. Все вызовы delete должны выполняться в деструкторах объектов, которые владеют указанными данными.

Стандартная библиотека заполнена объектами, которые делают такую ​​собственность, и поэтому вам почти не нужно писать на самом деле. Попробуйте unique_ptr, vector, shared_ptr или любой другой контейнер соответствует вашим конкретным потребностям.

Ответ 6

нашел этот после того, как я опубликовал также.