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

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

最佳答案

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

当用指针变量或函数的返回值初始化一个unique_ptr时,nullptrNULL或使用了 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);

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

关于c++ - 如何安全地将 unique_ptr 与可以返回 NULL 的函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56520134/

相关文章:

c++ - 如何制作面具

c++ - 从用户代码注入(inject)默认模板参数类型

c++ - 没有初始值设定项或显式默认构造函数的空类是否可用作 constexpr 变量?

c++ - 为什么允许泛型 lambdas 而不允许使用模板化方法的嵌套结构?

c++ - 有没有办法用 C++ 类包装 Objective-C 对象

c++ - 符合标准的 C++ 实现如何表明它不知道当前日期和时间?

c++ - 使用 boost 线程只能工作一半

c++ - 具有参数化构造函数的抽象工厂

c++ - 从释放的指针 move 会泄漏内存吗?

c++ - 使用 std::auto_ptr 的感觉