Как проверить, является ли автоматический указатель нулевым?

Я новичок в авто указатель. У меня есть это:

std::auto_ptr<myClass> myPointer(new MyClass(someArg));

Как я могу проверить, могу ли я создать экземпляр myPointer успешно? Я старался if (myPointer==NULL) и компилятор выдал ошибку:

ни один оператор "==" не соответствует этим операндам.

5 ответов

Решение

Что вы подразумеваете под "создание экземпляра"?

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

(Возможно, вы используете реализацию без исключения, которая может вернуть NULL при сбое выделения (вместо создания исключения), даже без использования (nothrow) спецификатор, но это не общий случай.)


Говоря в целом, вы можете проверить значение указателя. Вам просто нужно получить базовое представление, потому что, как вы обнаружили, std::auto_ptr не имеет operator==,

Для этого используйте X* std::auto_ptr<X>::get() const throw(), как это:

if (myPointer.get()) {
   // ...
}

Также обратите внимание, что std::auto_ptr устарела в C++0x, в пользуstd::unique_ptr, Предпочитайте последнее, где у вас есть доступ к соответствующей реализации.

Как насчет этого?

 if(myPointer.get()==NULL)

Я думаю myPointer.get() == NULL это то, что вы ищете.

При проверке std::auto_ptr за NULLЯ думаю, что это самая идиоматическая запись:

if (!myPointer.get()) {
    // do not dereference here
}

Учитывая утверждение, которое вы написали в своем вопросе, либо myPointer установлен, либо было сгенерировано исключение, и перехват исключения является правильным способом проверки, если что-то пошло не так.

В любом случае вы можете получить основной указатель, вызвав auto_ptr::get(),

Другие вопросы по тегам