Как проверить, является ли автоматический указатель нулевым?
Я новичок в авто указатель. У меня есть это:
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
, Предпочитайте последнее, где у вас есть доступ к соответствующей реализации.
При проверке std::auto_ptr
за NULL
Я думаю, что это самая идиоматическая запись:
if (!myPointer.get()) {
// do not dereference here
}
Учитывая утверждение, которое вы написали в своем вопросе, либо myPointer установлен, либо было сгенерировано исключение, и перехват исключения является правильным способом проверки, если что-то пошло не так.
В любом случае вы можете получить основной указатель, вызвав auto_ptr::get()
,