智能指针就是为了保证我们分配的对象在我们不使用后能够被自动释放。
智能指针主要有三种unique_ptr
, shared_ptr
和weak_ptr
,曾经还有auto_ptr
,但是在C++11中被废弃了deprecated(被unique_ptr
替代),而且在C++17中被删除了deleted。
unique_ptr
如名字代表的,unique_ptr对象是唯一的,你可以起别名(引用),但是不能复制多份(你可以通过move将一个对象转移到另一个对象,这样还是一份,原来的对象就失效了)
unique_ptr<int> p0(new int(n));
// unique_ptr<int> p1(p0); // compile error, deleted function
unique_ptr<int> p1(move(p0));
cout << *p1 << endl;
cout << boolalpha << static_cast<bool>(p0) << endl;
可以在声明时用一个指针初始化
unique_ptr<int> p(new int(47));
// unique_ptr<int> p = new int(47); // 这样不行,构造函数用了explicit修饰,不能隐士转换
也可以在之后通过reset方法重新指定一个指针,如果原来unique_ptr中有其它指针,那么原来那个指针指向的东西将会被释放。
unique_ptr<int> p;
// unique_ptr<int> p(new int(47)); // reset后new int(47)将会被释放
p.reset(new int(48));
shared_ptr
带了引用计数,每复制一份,计数就会加1,通常当作类的成员。
weak_ptr
- 指向shared_ptr指向的东西,但是不占计数,而且要用的话需要先转为shared_ptr(auto pp = p.lock())
- 解决循环引用,计数无法降到0,可以把一个设为weak_ptr
网友评论