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

时间:2019-06-10 03:24:11

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

我注意到它可以编译:

#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的情况,因为我认为这可能会导致一些问题。

2 个答案:

答案 0 :(得分:5)

很好。导致问题的原因仅是NULL宏(在大多数编译器中,宏会扩展为0)。 0nullptr_t的{​​{1}}和T*构造函数都匹配,因此它是模棱两可的并且不会编译。

使用指针变量或函数的返回值初始化unique_ptr时,使用unique_ptrnullptr还是NULL都无关紧要。它们都有相同的效果:空指针:

这很好,例如

0

注意:如果不与使用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); 进行分配的C函数接口,而是与使用malloc()的C ++函数接口,则不要使用自定义删除器。 new的默认删除器已经使用unique_ptr

答案 1 :(得分:3)

NULL是一个过时的 null指针常量,已弃用nullptr。两个常量都指定相同的内容,即空指针 value 。这些常量是编译时构造。

不建议使用

NULL,因为除了指定空指针值之外,还根据上下文指定整数零。 (这是一个定义为0的宏)。这很危险且容易出错,因此unique_ptr特别禁止这样做。

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