unique_ptr 使用详解 (C++11)
- C++11用更严谨的unique_ptr 取代了auto_ptr!
unique_ptr特性
- 基于排他所有权模式:两个指针不能指向同一个资源
- 无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时 右值赋值构造和赋值
- 保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。
- 在容器中保存指针是安全的
vector<unique_ptr<string>> vu;unique_ptr<string> p1(new string("I 'm martin."));unique_ptr<string> p2(new string("I 'm rock."));printf("p1: %p\n", p1.get());printf("p2: %p\n", p2.get());p1 = std::move(p2);printf("p1: %p\n", p1.get());printf("p2: %p\n", p2.get());unique_ptr<string> p3(new string("I 'm p3."));unique_ptr<string> p4(std::move(p3)); vu.push_back(move(p1));vu.push_back(move(p2));unique_ptr<int[]> ui(new int[5]);
构造函数
unique_ptr<T> up ;
unique_ptr<T> up1(new T()) ;
unique_ptr<T[]> up ;
unique_ptr<T[]> up1(new T[]) ;
unique_ptr<T,D> up();
unique_ptr<T,D> up(new T()); 赋值
unique_ptr<int> up1(new int(10));
unique_ptr<int> up2(new int(11));
up1 = std::move(up2);
主动释放对象
up = nullptr ;
或 up = NULL; 放弃对象控制权
up.release(); 重置
up.reset(…) ;
交换
up.swap(up1);