【问题标题】:pointer return by new check in C++通过 C++ 中的新检查返回指针
【发布时间】:2012-02-18 12:12:37
【问题描述】:

检查new operator 指针返回的最佳方法是什么 我看到以下类型的代码。假设我有class Test

类型 1

Test *ptr = new Test;
if ( ptr == NULL ) {
}

类型 2

Test *ptr = new Test;
if ( !ptr ) {
}

类型 3

Test *ptr = new Test;
if ( ptr == (Test*)0 ) {
}

【问题讨论】:

  • 请定义“最佳”的含义。那么异常呢?您是否使用了一些不会引发异常的特殊new
  • 最好的应该是if(ptr==nullptr),但前提是兼容 C++11 的编译器。
  • 您是否正在查看旧的 Win32/Windows/COM 代码?当前的 C++ 代码在新失败的情况下抛出异常;但在广泛支持异常之前,您必须检查 NULL。有时,Windows 或基于 COM 的代码会选择不使用异常,以避免移植旧代码库,或者只是因为有时更容易处理:COM 要求在从接口返回之前将所有异常转换为 HRESULT。有关更多详细信息,请参阅this SO question 的答案。

标签: c++


【解决方案1】:

您不检查 new 是否为 null 它会抛出异常 std::bad_alloc 以防失败。
所以你处理异常。

当然,如果您使用的不是nothrow 版本的new,则上述规则适用。

 try
  {
    Test *ptr = new Test;
  }
  catch (std::bad_alloc &e)
  {
    cout << "new Failed";
  }

【讨论】:

  • 这感觉更像是一个评论,而不是对所提问题的回答
  • 实际上这是问题的正确答案,因为不会有 Test * ptr = new Test; 的情况。将具有 NULL 或 0 值。
  • @DavidHeffernan:检查new返回的指针的返回值是没用的。你需要处理关于它的异常。如果你打算建议OP检查@987654327的返回值@ 那么恭喜你失去了new 提供的最重要的优势之一malloc。鉴于,我不明白它是如何回答问题的。
  • 除非 OP 使用不会抛出的 new
  • @DavidHeffernan:你错过了吗当然,如果你没有使用新的 nothrow 版本,则上述规则适用。部分答案???
【解决方案2】:

默认情况下 new 应该抛出一个 bad_alloc 异常,所以不需要检查。

另一方面,VC6 确实在 bad_alloc 上返回 0,在这种情况下,类型 3 在您没有 nullptr(在 C++11 标准中)的情况下应该完全没问题

另一种能够测试 NULL 的方法是使用 std::nothrow 调用 new:

ptr = new(std::nothrow) Test();

在任何情况下,请记住,您不必捕获每个抛出的 bad_alloc。你最好在可以响应的地方抓住它(释放内存或优雅地死去)。

【讨论】:

    【解决方案3】:

    对于 == 运算符,始终尝试 lhs 保持不变

     Test *ptr = new Test;
     if ( NULL == ptr ) { } 
    

    这里,如果你错误地写了=而不是==,就会产生编译错误。

    但是如果你写if(ptr = NULL),它不会报任何错误,NULL会被赋值给ptr

    【讨论】:

    • 无论哪种情况,我的编译器都会警告我。无需混淆代码。
    【解决方案4】:

    假设您的分配器/实现返回 0 而不是抛出,我认为这是最好的:

    Test* const ptr(new Test);
    if (0 == ptr) {
    // uh-oh
    }
    

    0在C++中很常见,你不会犯错把指针赋值给左边的常量。

    如果它是 if 的本地地址,您可能会喜欢这样:

    if (Test* const ptr = new Test) {
    // use it
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2011-03-08
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多