以下内容仍在更新完善…
智能指针
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。