unique_ptr是一个独占的智能指针,即unique_ptr不支持复制,但是支持通过move转移内部指针 unique_ptr<T> myPtr(new T); // ok unique_ptr<T> otherPtr = myPtr; // 编译错误 unique_ptr<T> otherPtr = move(myPtr); // ok 1. 2. 3. 同shared_ptr,unique_ptr也不能多个unique_ptr指向同一个内部数据...
注:如果确实想执行类似与#1的操作,要安全的重用这种指针,可给它赋新值。C++有一个标准库函数std::move(),让你能够将一个unique_ptr赋给另一个。例如: unique_ptr<string> ps1, ps2; ps1 = demo("hello"); ps2 = move(ps1); ps1 = demo("alexia"); cout << *ps2 << *ps1 << endl; 3. share...
结论1:std:move() 只是将一个实参强行转换为右值引用。 我们知道对象初始化时有构造函数,拷贝构造函数,移动构造函数;其中移动构造函数能够防止拷贝过程,减小性能开销; 1.拷贝构造函数通常使用赋值运算可以触发,如T a=b; 2.而移动构造函数需要使用右值引用来赋值,因此通常需要搭配std:move()使用 T a=std:move(b)...
unique_ptr 为独占的智能指针,与所指对象的内存绑定紧密,不能与其他unique_ptr类型的指针对象共享所指对象的内存。比如 unique_ptr<TEST>p1(new TEST("case_1")); auto p44 = p1; 1. 2. 编译是不能通过的。可以通过move来转移内存 unique_ptr<TEST>p1(new TEST("case_1")); auto p44 = move(p1); ...
// (可用于把unique_ptr传递给子函数,子函数将负责释放对象)// 4)std::move()可以转移对原始指针的控制权。// (可用于把unique_ptr传递给子函数,子函数形参也是unique_ptr)// 5)reset()释放对象。// p0.reset();p0.reset(newAA("bbb2"));// 释放p0指向的资源对象,同时指向新的对象。std::cout<...
1 首先定义实现如下所示的测试类,同时实现有参数和无参数的构造函数 2 实现函数,函数的入参类型为std::unique_ptr, 而std::unique_ptr包裹上一步骤定义的对象 3 测试代码段如下所示,先实现std::unique_ptr<Company>类型变量,然后通过std::move传递给已经实现的函数 4 从调试运行的结果看,std::unique_ptr...
unique_ptr<X>f(){unique_ptr<X>p(new X);// 做一些事情,中间可能会抛出某个异常returnmove(p);} 现在,我们可以参考下面的示例代码这样使用函数f()。 {// 使用移动构造函数(move constructor)unique_ptr<X>q=f();// 使用qq->DoSomething();// 复制指针q所指向的对象X x=*q;}// 离开作用域,q...
swap(temp.m_p); return *this; } MyClass(MyClass&& rhs) noexcept = default; MyClass& operator=(MyClass&& rhs) noexcept = default; ~MyClass() = default; }; int main() { MyClass a{42}; MyClass b{std::move(a)}; //a.m_p 为nullptr MyClass c{b}; std::cout << (*c.m_...
unique_ptr<string> p3(std::move(p1)); // 合法, std::move()将左值改变成右值 p1 = std::move(p2); // 使用move把左值转成右值就可以赋值了,效果和auto_ptr赋值一样 简单代码例子: #include <iostream>#include<string>#include<memory>#include<stdio.h>#include<stdlib.h>#include<vector>usingnam...
std::unique_ptr<int>sp(std::make_unique<int>(12345));std::unique_ptr<int>sp1(std::move(sp)); std::move将sp持有的堆内存转移给sp1后,sp不再持有堆内存的引用,变成一个空的智能指针对象。 那么,是不是所有的对象,都可以用std::move操作呢?答案是否定的,只有实现了移动构造函数或移动运算符的类才...