我注意到它可以编译:
#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的情况,因为我认为这可能会导致一些问题。
答案 0 :(得分:5)
很好。导致问题的原因仅是NULL
宏(在大多数编译器中,宏会扩展为0
)。 0
与nullptr_t
的{{1}}和T*
构造函数都匹配,因此它是模棱两可的并且不会编译。
使用指针变量或函数的返回值初始化unique_ptr
时,使用unique_ptr
,nullptr
还是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
特别禁止这样做。
在运行时,函数不可能返回空指针常量,该常量属于完全错误的事物类别。它返回一个空指针值。那时,NULL
和nullptr
都没有。