Как проверить неверный указатель?
Мой текущий код в действии:
if( objectPointer != NULL){
delete objectPointer;
}
не работает, потому что указатели получают компилятором недопустимые шестнадцатеричные числа, такие как:
и т.д....
Итак, что лучший способ проверить недопустимый указатель перед попыткой удалить объект?
Ответы
Ответ 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
нашел этот после того, как я опубликовал также.