我想了解为什么
std::unique_ptr<MyClass> p = new MyClass;
不起作用,但是
std::unique_ptr<MyClass> p;
p.reset(new MyClass);
很好 我有点理解它们的不同之处,但是我想知道为什么选择了使它们与众不同的原因。分配与重置不同有什么危险?
首先,std::unique_ptr<MyClass> p = new MyClass;
不是赋值,而是复制初始化。而且它不起作用,因为采用原始指针的构造函数std::unique
被标记为explicit
:
explicit unique_ptr( pointer p ) noexcept;
声明为explicit
避免意外的(可能是危险的)隐式转换,例如:
void foo(std::unique_ptr<int> uptr);
int *rptr = new int;
foo(rptr); // suppose rptr is implicitly converted to std::unique_ptr<int>
// then the ownership is passed to the parameter uptr
// when foo() returns uptr is destroyed; the pointer managed by it is deleted too
// since rptr has been deleted continue to deference on it leads to UB
*rptr = 42; // UB
请注意,复制初始化(例如)explicit
中不考虑构造函数std::unique_ptr<MyClass> p = new MyClass;
。您可以在直接初始化中使用它们(例如std::unique_ptr<MyClass> p (new MyClass);
)。它们用于禁止隐式转换,但是您可以执行显式转换。像使用一样reset
,您必须显式地执行这些操作,以表明(并使自己)对自己正在做的事情非常确定。
顺便说一句:原始指针的赋值也不起作用,因为std::unique_ptr
没有重载赋值运算符将原始指针作为参数。由于上述原因,原始指针无法隐式转换为std::unique_ptr
,因此std::unique_ptr
也不会考虑移动分配运算符(作为参数)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句