如何安全地将 unique_ptr 与可以 return NULL 的函数一起使用?

How to safely use unique_ptr with functions which can return NULL?

我注意到这个编译:

#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(带有自定义删除器)来管理此类原始指针。 我担心那些函数 return NULL 的情况,因为我认为这可能会导致一些问题。

没关系。只是 NULL 宏(在大多数编译器上扩展为 0)导致了问题。 0 匹配 unique_ptrnullptr_tT* 构造函数,因此它有歧义,无法编译。

当用指针变量或函数的return值初始化unique_ptr时,nullptrNULL或[=12并不重要=] 被使用。它们都具有相同的效果:一个空指针:

这很好,例如

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.

NULL 是一个过时的 空指针常量 ,不推荐使用 nullptr。两个常量指定相同的东西,空指针 value。这些常量是编译时构造。

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

在运行的时候,一个函数不可能return一个空指针常量,这属于完全错误的一类东西。它 return 是一个空指针值。那时候既没有NULL也没有nullptr.