10

我是自动指针的新手。我有这个:

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

如何测试我是否可以myPointer成功实例化?我试过if (myPointer==NULL)了,编译器发出了一个错误:

没有运算符 "==" 匹配这些操作数。

4

5 回答 5

23

“实例化”是什么意思?

在符合标准的实现上,要么构造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. 如果您可以访问符合要求的实现,则更喜欢后者。

于 2011-08-15T20:05:01.387 回答
5

这个怎么样?

 if(myPointer.get()==NULL)
于 2011-08-15T20:06:54.553 回答
4

我想myPointer.get() == NULL这就是你要找的。

于 2011-08-15T20:06:55.317 回答
1

鉴于您在问题中写的语句,要么设置了 myPointer,要么引发了异常,并且捕获异常是检查是否出现任何问题的正确方法。

在任何情况下,您都可以通过调用auto_ptr::get().

于 2011-08-15T20:07:48.123 回答
1

在检查std::auto_ptrforNULL时,我认为这是最惯用的表示法:

if (!myPointer.get()) {
    // do not dereference here
}
于 2014-05-19T10:57:18.603 回答