【问题标题】:how to test whether auto pointer is null?如何测试自动指针是否为空?
【发布时间】:2011-08-15 20:03:19
【问题描述】:

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

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

如何测试能否成功实例化myPointer?我试过if (myPointer==NULL),编译器报错:

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

【问题讨论】:

  • 始终尝试完整地逐字复制错误消息。编译器通常会在你看到它们之前删除所有不重要的部分。
  • 说真的,这里的“实例化”是什么意思?
  • 我认为我能否成功实例化myPointer仅表示myPointer是否创建成功。问题及其答案 - 最重要的是the one of Lightness Races in Orbit - 如果没有这种分心,可能会更好。
  • 记住奥卡姆的剃刀男(和女)。发布的代码通常会被修剪以减少冗长,并且不一定会在分配 myPointer 之后立即执行 NULL/nullptr 测试。
  • @brewmanz:如果 OP 将代码“修剪”得如此之多以至于它实际上不再证明问题,那么这与奥卡姆剃刀相反。作为一个问题也完全没有用。

标签: c++ auto-ptr


【解决方案1】:

“实例化”是什么意思?

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

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


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

为此,请使用X* std::auto_ptr&lt;X&gt;::get() const throw(),如下所示:

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

还要注意std::auto_ptr is deprecated in C++0x, in favour of std::unique_ptr。如果您可以访问符合标准的实现,则更喜欢后者。

【讨论】:

  • OP 可能在不使用异常的上下文中工作(因此 new 可以返回 NULL)。这比人们愿意承认的要普遍得多。
  • @Zack:不指定(nothrow) 是否有效? @Zack:似乎that's only relevant for non-compliant compilers,我并不为他们烦恼。这个问题是关于 C++ 的。
  • @Tomalak Geret'kal 在不支持异常的嵌入式编译器上,不需要调用newstd::nothrow 版本。如果分配失败,任一调用都将返回 NULL。
  • 即使在非嵌入式环境中,对于很多真实的生产代码,异常处理也是禁用的(例如,我个人可以证明 Firefox 和 Webkit 都这样做,我听说 OpenOffice 也是如此)。是的,这是编译器的不兼容模式。是的,这意味着许多标准库无法使用或行为不符合文档说明。正如她所说,它仍然是 C++,我认为我们(StackOverflow 问题的回答者)应该意识到这一点。
  • @user853069:仅当您想处理 std::bad_alloc 时。通常你不会打扰:如果你的内存用完了,那么继续执行程序就没有什么意义了。让它冒泡到main 并终止你的进程。 (std::auto_ptr 的使用与动态分配对象的这一方面无关。)
【解决方案2】:

这个怎么样?

 if(myPointer.get()==NULL)

【讨论】:

    【解决方案3】:

    我认为myPointer.get() == NULL 是您要找的。​​p>

    【讨论】:

      【解决方案4】:

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

      在任何情况下,您都可以通过调用auto_ptr::get() 来获取底层指针。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 2011-02-27
          • 2011-09-17
          • 2012-01-30
          • 2012-12-26
          • 1970-01-01
          相关资源
          最近更新 更多