0 引言
智能指针通过引用计数(reference count)的方式来自动化/智能化管理内存,可以大大提高应用程序的灵活性,降低系统的复杂度。 在软件的重构中,考虑用智能指针来替代手动的new/delete 方式是值得探索的。 smart pointer is an object that help to manage the use and deletion of an object.
0.1 智能指针是一个模板, 类似于vector或者string. 因此,在初始化一个智能指针时必须要提供额外的信息:即指针可以指向的类型。eg:
shared_ptr<string> p1;
shared_ptr<list<int>> p2;
0.2 智能指针中有一个class member应该就是它需要管理的指针本身。另外,还有一个static的number用来记录该指针的引用次数,可以通过调用use_count()函数来得到。
shared_ptr<T> p(q); ///< p 是shared_ptr q的拷贝,此操作会递增q中的计数器。q中的指针必须能转换为T*.
p.use_count();
p.unique();
0.3 销毁
当指向一个指针对象的最后一个shared_ptr被销毁时,shared_ptr类会自动销毁此对象。 它是通过析构函数完成销毁工作的。
1 什么是智能指针,要如何使用它
存在三种形式的智能指针:shared_ptr, unique_ptr and weak_ptr. listed as below:
1.1 shared_ptr: 当该指针有可能被多个对象管理时,可以用shared_ptr。基础语法:
///< create a shared_ptr shared_ptr<int> bar (new int(10)); bar = make_shared<int> (20); ///< can be used as a pointer. if(p) or if (!p) *p p->mem or (*p).mem T* ptr = p.get(); ///< 返回p中保存的指针 swap(p, q); ///< 交换p 和q中保存的指针 p.swap(q); /// shared_ptr only operation shared_ptr<int> p = make_shared<int> (new int); shared_ptr<int> p(q);
1.2 unique_ptr: 当用户想比较严格地控制指针的管理者时,应当使用unique_ptr.
1.3 weak_ptr
2 智能指针的应用场景
3 智能指针的缺陷和隐藏陷阱
4 结论