在C++11中,将对象的所有权从一个unique_ptr转移到另一个unique _ptr
Transferring the ownership of object from one unique_ptr to another unique_ptr in C++11?
在C++11
中,我们可以使用std::move()
将对象的所有权转移到另一个unique_ptr
。所有权转移后,放弃所有权的智能指针变为null
,get()
返回nullptr.
std::unique_ptr<int> p1(new int(42));
std::unique_ptr<int> p2 = std::move(p1); // Transfer ownership
当它将所有权转移到另一个unique_ptr
时,在哪些情况下这将是有用的?
以下情况涉及将所有权从一个unique_ptr
转移到另一个:从函数返回,并作为参数传递给类似构造函数的函数。
假设你有一些多态型Animal
:
struct Animal {
virtual ~Animal() {}
virtual void speak() = 0;
};
具有具体的子类Cat
和Dog
:
struct Cat : Animal {
void speak() override { std::cout << "Meow!n"; }
};
struct Dog : Animal {
void speak() override { std::cout << "Woof!n"; }
};
你想要一个简单的工厂,根据所需的服从价值创造一只宠物。然后工厂必须返回一个指针。我们希望宠物工厂将创建的宠物的所有权转移给调用者,因此合理的退货类型为std::unique_ptr<Animal>
:
std::unique_ptr<Animal> createPet(double obedience) {
if (obedience > 5.0)
return std::make_unique<Dog>();
return std::make_unique<Cat>();
}
现在,假设我们想要创建一个拥有宠物的House
,那么我们可能想要将宠物传递到House
的构造函数中。关于如何最好地将unique_ptr
传递给构造函数,有一些争论(请参阅本文的评论),但它看起来像这样:
class House {
private:
std::unique_ptr<Animal> pet_;
public:
House(std::unique_ptr<Animal> pet) : pet_(std::move(pet)) {}
};
我们已经将unique_ptr
传递到构造函数中,然后将其"移动"到成员变量中。
调用代码可能看起来像:
auto pet = createPet(6.0);
House house(std::move(pet));
在构造House
之后,pet
变量将是nullptr
,因为我们已经将宠物的所有权转移到了House
。
现场演示
例如,如果您调用一个函数,您可以在参数列表中move
您的unique_ptr
,这样它就可以成为函数签名的一部分
foo ( std::unique_ptr<T>&& ptr )
你可以用调用foo
foo( std::move(myPtr) );
请注意,std::move
是一个无条件强制转换,unique_ptr
是一个有状态的对象,该状态的一部分是unique_ptr
正在管理的指针,使用std::move
时,您正在强制转换整个对象,您并没有真正更改任何关于所有权的内容,在使用std::move
时,std::unique_ptr
没有什么特殊之处,因为std::move
并不真正关心任何特定的东西,正如我所说的,它是一个无条件的强制转换,unique_ptr
只是被强制转换,作为unique_ptr<T>
类型实例的整个对象都被强制转换。
如果您想讨论unique_ptr
所指向对象的所有权转移,您应该考虑std::unique_ptr<T>
本身提供的swap
。
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误