如何安全地将 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_ptr
的 nullptr_t
和 T*
构造函数,因此它有歧义,无法编译。
当用指针变量或函数的return值初始化unique_ptr
时,nullptr
、NULL
或[=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
.
我注意到这个编译:
#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_ptr
的 nullptr_t
和 T*
构造函数,因此它有歧义,无法编译。
当用指针变量或函数的return值初始化unique_ptr
时,nullptr
、NULL
或[=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
.