我在std::unique_ptr
reference中看到以下注释:
只有非const
unique_ptr
才能将托管对象的所有权转移到另一个unique_ptr
。 conststd::unique_ptr
管理的对象的生命周期仅限于创建指针的范围。
有没有人可以用一个例子来解释它?我无法弄明白为什么。
答案 0 :(得分:10)
您根本无法从const std::unique_ptr
移动,也无法使用其他修改成员函数 - swap
,release
和reset
(这些在逻辑上不是const qualified,无法在const
实例上调用。
转移所有权意味着将旧所有者重置为非拥有状态,从而对其进行修改。
const std::unique_ptr
将在其生命周期内(从初始化开始)管理最多一个对象。
如果是std::unique_ptr const&
,您就赢了能够通过此引用(const正确性)从引用的(甚至非常量的)std::unique_ptr
转移所有权。
答案 1 :(得分:3)
reset
,release
,swap
和移动赋值函数是非const成员函数,因此不能与std::unique_ptr
类的const实例一起使用。因此,const std::unique_ptr
无法被修改,并且被迫拥有指针,直到它超出范围。
答案 2 :(得分:3)
通常,您可以使用移动分配或移动构造函数将托管对象的所有权转移到另一个unique_ptr
,例如:
std::unique_ptr<int> p(new int(1));
std::unique_ptr<int> q(std::move(p));
//now q owns the pointer, which is freed when q is destructed
但如果p
为const
,您将无法执行此操作,并且在p
被销毁时将释放托管对象:
const std::unique_ptr<int> p(new int(1));
std::unique_ptr<int> q(std::move(p)); //compilation error
答案 3 :(得分:2)
unique_ptr拥有它指向的内存。
void MyFunc()
{
// Creates a unique pointer that points at a Foo object.
std::unique_ptr<Foo> foo = std::make_unique<Foo>();
// ... do some stuff, then return
}
在这个例子中,我们创建一个Foo对象并将其分配给我们的unique_ptr
。通常,当你在堆上创建一些东西时,你必须在堆中使用new
为它分配空间并构造它,并delete
来破坏它并释放它的空间。在这里,只要您离开创建unique_ptr
的范围(在这种情况下是函数的结尾),unique_ptr
就会处理释放。
只有非const unique_ptr才能将托管对象的所有权转移到另一个unique_ptr。
这意味着您可以将指针的所有权转移到其他unique_ptr
,但前提是它未标记为const。一次只能有一个unique_ptr
拥有一个对象。
这样做的一种方法是:
std::unique_ptr<Foo> foo1 = std::make_unique<Foo>();
std::unique_ptr<Foo> foo2 = std::move(foo1);
现在foo1
中的指针已移至foo2
。 foo1
不再管理内存,foo2
。
const std :: unique_ptr管理的对象的生命周期仅限于创建指针的范围。
这意味着当您的unique_ptr离开作用域时,它会删除它指向的对象。好像你这样做了:
void MyFunc()
{
Foo* foo = new Foo()
// ... do some stuff, then return
delete foo;
}
好处是,现在您不必手动调用delete,这很好,因为如果您忘记删除它,可能会导致内存泄漏。