【问题标题】:How to safely use unique_ptr with functions which can return NULL?如何安全地将 unique_ptr 与可以返回 NULL 的函数一起使用?
【发布时间】:2019-06-10 03:24:11
【问题描述】:

我注意到这个编译:

#include<memory>
#include<iostream>
using namespace std;
int main()
{
    unique_ptr<int>a(nullptr);
    if(!a)
    cout<<"NULLPTR";
}

但是,这不是:

#include<memory>
#include<iostream>
using namespace std;
int main()
{
    unique_ptr<int>a(NULL);
    if(!a)
    cout<<"NULL";
}

我正在使用具有several functions which return a raw pointer 的库,并且必须在使用后手动释放它们。我想使用 unique_ptr(带有自定义删除器)来管理这些原始指针。 我担心那些函数返回 NULL 的情况,因为我认为这可能会导致一些问题。

【问题讨论】:

  • NULL 不是问题;这就是你用它做什么。函数 return Type* 被键入给调用者,无论它返回 NULLnullptr(您应该使用)还是其他。奇怪的是您询问了“可以返回 NULL 的函数”,但没有发布这样的函数作为显示您担心的示例。
  • @WhozCraig 我已经添加了我正在使用的库的链接。您可以检查页面上给出的第一个功能。

标签: c++ c++14 smart-pointers unique-ptr


【解决方案1】:

没关系。导致问题的只是 NULL 宏(在大多数编译器上仅扩展为 0)。 0 匹配 unique_ptrnullptr_tT* 构造函数,所以它是模棱两可的,不会编译。

使用指针变量或函数的返回值初始化unique_ptr 时,使用nullptrNULL0 都没有关系。它们都具有相同的效果:空指针:

这很好,例如

int* int_p1 = NULL;
int* int_p2 = (int*)malloc(sizeof(int));

unique_ptr<int, decltype(&free)> a1(int_p1, free);
unique_ptr<int, decltype(&free)> a2(int_p2, free);

注意:如果您不是与使用 malloc() 进行分配的 C 函数交互,而是使用使用 new 的 C++ 函数,请不要使用自定义删除器。 unique_ptr 的默认删除器已经使用了delete

【讨论】:

    【解决方案2】:

    NULL 是一个过时的空指针常量,它已被nullptr 弃用。两个常量指定同一个东西,一个空指针value。这些常量是编译时构造。

    NULL 已弃用,因为除了指定空指针值外,它还指定整数零,具体取决于上下文。 (它是一个定义为0 的宏)。这是危险且容易出错的,因此unique_ptr 明确禁止这样做。

    在运行时,函数不可能返回一个空指针常量,它属于完全错误的事物类别。它返回一个空指针值。那时,既没有NULL,也没有nullptr

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 2012-11-30
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2018-08-05
      • 2020-05-20
      相关资源
      最近更新 更多