C++ 如何安全地将unique_ptr与可以返回NULL的函数一起使用?
我注意到,这包括:C++ 如何安全地将unique_ptr与可以返回NULL的函数一起使用?,c++,c++14,smart-pointers,unique-ptr,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"; } #包括 #包括 使用名称空间std; int main() { 唯一的ptra(nullptr); 如果(!a) cout这很好。造成问题的只是NULL宏(在大
#include<memory>
#include<iostream>
using namespace std;
int main()
{
unique_ptr<int>a(nullptr);
if(!a)
cout<<"NULLPTR";
}
#包括
#包括
使用名称空间std;
int main()
{
唯一的ptra(nullptr);
如果(!a)
cout这很好。造成问题的只是NULL
宏(在大多数编译器上扩展为0
)。0
匹配nullptr\t
和t*
unique\ptr
的构造函数,因此它不明确,无法编译
当使用指针变量或函数的返回值初始化unique\u ptr
时,无论是使用NULL ptr
、NULL
还是0
,它们都具有相同的效果:NULL指针:
例如,这是非常好的
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);
int*int_p1=NULL;
int*int_p2=(int*)malloc(sizeof(int));
唯一的ptr a1(内部p1,免费);
唯一的ptr a2(内部p2,免费);
注意:如果不使用C代码函数,使用<代码> MARROCK()/CUD>分配,但使用C++代码的函数< <代码> < /C> >,不要使用自定义删除器。默认代码的删除器> UngQuyPPTR <代码>已经使用<代码>删除< />代码>
< P> >,这只是“<代码> null <代码>宏”(在大多数编译器上扩展为0
)这就是问题的根源。0
匹配unique\u ptr
的nullptr\t
和t*
构造函数,因此它不明确且不会编译
当使用指针变量或函数的返回值初始化unique\u ptr
时,无论是使用NULL ptr
、NULL
还是0
,它们都具有相同的效果:NULL指针:
例如,这是非常好的
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);
int*int_p1=NULL;
int*int_p2=(int*)malloc(sizeof(int));
唯一的ptr a1(内部p1,免费);
唯一的ptr a2(内部p2,免费);
注意:如果您没有与使用
malloc()的C函数接口分配,但使用C++函数的<代码> < <代码>,不使用自定义删除器。默认代码的删除器> UngQuyPPTR <代码>已经使用<代码>删除>代码> .< /P> <代码> null <代码>是一个过时的空指针常数,被弃用,赞成NulLPTR。这些常量是编译时构造
NULL
不推荐使用,因为除了指定NULL指针值外,它还根据上下文指定整数零。(它是定义为0
的宏)。这很危险且容易出错,因此unique\u ptr
特别禁止使用它
在运行时,函数不可能返回空指针常量,它属于完全错误的类别。它返回空指针值。此时,既没有null
,也没有nullptrnull
是一个过时的空指针常量,不赞成使用nullptr
。这两个常量都指定了相同的东西,一个空指针值。这些常量是编译时构造
NULL
不推荐使用,因为除了指定NULL指针值外,它还根据上下文指定整数零。(它是定义为0
的宏)。这很危险且容易出错,因此unique\u ptr
特别禁止使用它
在运行时,函数不可能返回空指针常量,这属于一个完全错误的类别。它返回空指针值。此时,既没有null
也没有nullptr
null
不是问题;这是您对它所做的操作。函数返回Type*
不是键入的o调用者,无论它是否返回NULL
,nullptr
(您应该使用它),或者其他什么。奇怪的是,您询问了“可以返回NULL
的函数”,但没有发布这样的函数作为示例来展示您的担忧。@WhozCraig我已经添加了我正在使用的库的链接。您可以检查页面上给出的第一个函数。NULL
不是问题;问题在于您如何处理它。函数returnType*
被键入调用者,无论它是否返回NULL
,nullptr
(您应该使用它),或者其他什么。奇怪的是,您询问了“可以返回NULL
”的函数,但没有发布这样的函数作为示例来表达您的担忧。@WhozCraig我添加了我正在使用的库的链接。您可以查看页面上给出的第一个函数。