以下内容仍在更新完善...
智能指针
C++没有垃圾回收机制,因此每次使用完new分配内存,都需要手动delete。如果没有delete,可能会导致内存泄漏程序崩溃。
此时,使用智能指针就可以缓解这个问题。智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。
C++11中,最常使用的智能指针类型是shared_ptr。它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减1。只有引用计数为0时,智能指针才会自动释放引用的内存资源。
auto_ptr智能指针
auto_ptr的简单代码示例:
auto_ptr<string> p1 (new string ("123456")); auto_ptr<string> p2; p2 = p1;
此时p2获得了p1针对对象的所有权,虽然程序不会报错,但是如果后续程序中出现访问p1的操作则会报错。
unique_ptr智能指针
unique_ptr保证同一时间内只有一个智能指针可以指向该对象。
unique_ptr的简单代码示例:
unique_ptr<string> p3 (new string ("auto")); unique_ptr<string> p4; p4 = p3; //程序会报错,因为unique_ptr具有独占性
shared_ptr智能指针
shared_ptr智能指针类型拥有以下成员函数:
use_count 返回引用计数的个数
unique 返回是否是独占所有权( use_count 为 1)
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少
get 返回内部对象(指针)
shared_ptr的简单代码示例:
int main() { string *s1 = new string("12"); shared_ptr<string> ps1(s1); shared_ptr<string> ps2; ps2 = ps1; //两个指针指向同一对象 cout << ps1.use_count()<<endl; //2 cout<<ps2.use_count()<<endl; //2 cout << ps1.unique()<<endl; //0,表示ps1不独占所有权 ps1.reset(); //放弃ps1的拥有权,引用计数减少 cout << ps1.use_count()<<endl; //0 cout<<ps2.use_count()<<endl; //1 cout << ps2.unique()<<endl; //1,表示ps2独占所有权 return 0; }
weak_ptr智能指针
weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象。它作为弱引用指针,其实现依赖于counter的计数器类和share_ptr的赋值。
weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针。 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。
weak_ptr是用来解决 shared_ptr 相互引用时的死锁问题,如果说两个 shared_ptr 相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。它是对对象的一种弱引用,不会增加对象的引用计数,和 shared_ptr 之间可以相互转化,shared_ptr 可以直接赋值给它,它可以通过调用lock函数来获得 shared_ptr。