的构造函数unique_ptr<T>
接受指向类型对象的原始指针T
(因此,它接受T*
).
在第一个示例中:
unique_ptr<int> uptr (new int(3));
指针是a的结果new
表达式,而在第二个示例中:
unique_ptr<double> uptr2 (pd);
该指针存储在pd
多变的。
从概念上讲,没有任何改变(您正在构建一个unique_ptr
来自原始指针),但第二种方法可能更危险,因为它允许您执行以下操作:
unique_ptr<double> uptr2 (pd);
// ...
unique_ptr<double> uptr3 (pd);
因而有two有效封装同一对象的唯一指针(从而违反了unique指针)。
这就是为什么在可能的情况下创建唯一指针的第一种形式更好的原因。请注意,在 C++14 中我们将能够执行以下操作:
unique_ptr<int> p = make_unique<int>(42);
这既更清晰又更安全。现在针对您的这个疑问:
我还不清楚的是,以这种方式声明的指针与以“正常”方式声明的指针有何不同。
智能指针应该对对象所有权进行建模,并在指向该对象的最后一个(智能的、拥有的)指针超出范围时自动销毁所指向的对象。
这样你就不必记住做什么delete
在动态分配的对象上 - 智能指针的析构函数将为您执行此操作 - 也不用担心您是否不会取消引用指向已被销毁的对象的(悬空)指针:
{
unique_ptr<int> p = make_unique<int>(42);
// Going out of scope...
}
// I did not leak my integer here! The destructor of unique_ptr called delete
Now unique_ptr
是一个模拟唯一所有权的智能指针,这意味着在您的程序中的任何时候都只能有one(拥有)指向所指向对象的指针 - 这就是为什么unique_ptr
是不可复制的。
只要您使用智能指针的方式不违反它们要求您遵守的隐式契约,您就可以保证不会泄漏内存,并且将强制执行对象的正确所有权策略。原始指针不给你这样的保证。