Как проверить неверный указатель? - PullRequest
12 голосов
/ 27 января 2009

Мой текущий код с эффектом:

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

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

  • 0xbaadf00d
  • 0xDEADBEEF

и т.д ....

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

Ответы [ 6 ]

31 голосов
/ 27 января 2009

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

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

13 голосов
/ 27 января 2009

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

delete NULL; // this is allowed

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

10 голосов
/ 27 января 2009

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

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

3 голосов
/ 27 января 2009

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

1 голос
/ 08 сентября 2011

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

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

0 голосов
/ 27 января 2009

найдено это после того, как я также написал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...