Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何测试自动指针是否为空?_C++_Auto Ptr - Fatal编程技术网

C++ 如何测试自动指针是否为空?

C++ 如何测试自动指针是否为空?,c++,auto-ptr,C++,Auto Ptr,我不熟悉自动指针。我有这个: std::auto_ptr<myClass> myPointer(new MyClass(someArg)); std::auto_ptr myPointer(新的MyClass(someArg)); 如何测试是否可以成功实例化myPointer?我尝试了if(myPointer==NULL),编译器发出了一个错误: 没有运算符“==”与这些操作数匹配 “实例化”是什么意思 在符合标准的实现上,MyClass的构造成功,或者抛出异常,auto_ptr

我不熟悉自动指针。我有这个:

std::auto_ptr<myClass> myPointer(new MyClass(someArg));
std::auto_ptr myPointer(新的MyClass(someArg));
如何测试是否可以成功实例化
myPointer
?我尝试了
if(myPointer==NULL)
,编译器发出了一个错误:

没有运算符“==”与这些操作数匹配

“实例化”是什么意思

在符合标准的实现上,
MyClass
的构造成功,或者抛出异常,
auto_ptr
将不再在范围内。因此,在您提供的示例中,
auto_ptr
表示的指针值不能为
NULL

(您使用的实现可能没有异常支持,在分配失败时返回
NULL
(而不是抛出异常),即使没有使用
(nothrow)
说明符,但这不是一般情况。)


一般来说,您可以检查指针的值。您只需要获得底层表示,因为正如您所发现的,
std::auto_ptr
没有
操作符==

为此,请使用
X*std::auto\u ptr::get()const throw()
,如下所示:

if (myPointer.get()) {
   // ...
}
还要注意的是。如果您可以访问一致性实现,则更喜欢后者。

这如何

 if(myPointer.get()==NULL)

我认为您正在寻找的是
myPointer.get()==NULL

根据您在问题中所写的语句,设置myPointer或引发异常,捕获异常是检查是否出错的正确方法


在任何情况下,当检查
std::auto_ptr
是否为
NULL
时,都可以通过调用
auto_ptr::get()
来获取底层指针,我认为这是最常用的表示法:

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

OP可能在不使用异常的上下文中工作(因此
new
可以返回NULL)。这比人们愿意承认的要普遍得多。@Zack:不指定
(nothrow)
,这有效吗@扎克:看来,我不在乎他们。这个问题是关于C++的。在不支持异常的嵌入式编译器上,@ Toalalk Geel'KAL不需要调用<代码> STD::NOVELAP/<代码>版本>代码>新< /代码>。如果分配失败,任何一个调用都将返回NULL。即使在非嵌入式环境中,对许多实际的生产代码也会禁用异常处理(例如,我个人可以证明Firefox和Webkit都会这样做,我听说OpenOffice也是如此)。是的,这是编译器的不兼容模式。是的,这意味着标准库的许多部分不可用或不符合文档规定。她说话时仍然是C++,我认为我们(StAcExpple问题的回答者)应该知道它。@ USER85 3069:只有在你想处理<代码> STD::BADYOLLC/<代码>。通常你不必费心:如果你的内存用完了,继续执行程序就没有什么意义了。只需让它冒泡到
main
并终止您的进程。(使用
std::auto_ptr
与动态分配对象的这一方面无关。)始终尝试完整地逐字复制错误消息。编译器通常会在您看到它们之前删除所有不重要的位。不过,说真的,您这里的“实例化”是什么意思?我认为能否成功实例化myPointer意味着myPointer是否成功创建。最重要的是,如果没有这种干扰,问题和答案可能会更好。发布的代码通常会被修剪以减少冗长,并且不一定会在myPointer的分配之后立即执行NULL/nullptr测试。@brewmanz:如果OP对代码进行了修剪,以至于不再实际演示问题,那么这与Occam的剃刀正好相反。作为一个问题,这也是完全没有用的。