#include<iostream> #include<functional> #include<algorithm> #include<vector> #include<string> #include<deque> #include<list> using namespace std; void foo_constuct() { //一般这种构造 std::unique_ptr<int> ptr ( new int(3)); //空构造 std::unique_ptr<int >ptr1 ; //下面三种构造是错误的 /*std::unique_ptr<int> ptr2 = ptr; std::unique_ptr<int> p3(p); ptr1 = p;*/ } void foo_reset() { int* Neew = new int(3); int* p = new int(5); { std::unique_ptr<int>pp(Neew); pp.reset(p);
} } void foo_release();//与auto一致,也不会释放原来的指针,只是简单的将自身清空。 void foo_move()//多了个move的用法 { int* p = new int(3); { //unique_ptr交出其内部指针的所有权,而自身置空,内部指针不会释放。 std::unique_ptr<int>uptr(p); std::unique_ptr<int>uptr2 = std::move(uptr); //这里的调用就会出错,因为拷贝构造函数的存在,uptr实际上已经释放了其内部指针的所有权了 printf("%d\n", *uptr); } } void foo_ary() { std::vector<std::unique_ptr<int>> ary; std::unique_ptr<int> ptr1(new int(3)); ary.push_back(std::move(ptr1)); //这里的调用就会出错,因为拷贝构造函数的存在,ptr11实际上已经释放了其内部指针的所有权了 printf("%d\n", *ptr1); } int main() { foo_move(); //基本构造方法 foo_constuct(); //reset的使用方法和auto是一样的 foo_reset(); }