c++智能指针
手动管理内存很容易造成内存泄漏,现代c++的智能指针可以在很大程度上帮我们缓解这个问题,降低我们的手动管理内存的心智负担,智能指针有好几种,比如shared_ptr、unique_ptr还有weak_ptr
共享指针shared_ptr
共享指针会记录有多少个共享指针指向同一个物体,当这个数字降为0的时候,程序就会自动释放这个物体,省去我们手动delete的烦恼,要使用智能指针首先需要#include<memory>
shared_ptr<int> p; p = make_shared<int>(100); //或者 shared_ptr<int>p{make_shared<int>(100)};
这段代码展示了我们如何定义一个智能指针以及初始化,make_shared会动态分配一块内存创建对应的资源然后让它shared_ptr指向它,它是一个模板可以接受一个类型和对应的初始化参数,除了用make_shared还可以用new初始化shared_ptr
shared_ptr<int> p {new int(100)};
更推荐使用shared_ptr<int>p{make_shared<int>(100)};因为总体来说make_shared的效率更高。
shared_ptr怎么自动管理内存
例如用共享指针来管理Ball的创建与销毁:
class Ball
{
public:
Ball(){
cuot<<"A ball appears"<<endl;
}
~Ball(){
cout<<"A ball disappears"<<endl;
}
void Bounce(){
cout<<"A ball jumps"<<endl;
}
}
int main()
{
shared_ptr<Ball> p = make_shared<Ball>();
cout<<p.use_cuont()<<endl;
shared_ptr<Ball>p2 = p;
cout<<p.use_count()<<" "<<p2.use_count()<<endl;
shared_ptr<Ball>p3 = p;
cout<<p.use_count()<<" "<<p2.use_count()
<<p3.use_count()<<endl;
p.reset();
p2.reset();
p3.reset();
}
运行结果:
独享指针unique_ptr
unique_ptr特性
-
基于排他所有权模式:两个指针不能指向同一个资源
-
无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值
-
保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。
-
在容器中保存指针是安全的
使用方法:
运行结果:
weak_ptr
weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。 同时weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象。
-
弱指针的使用; weak_ptr wpGirl_1; // 定义空的弱指针 weak_ptr wpGirl_2(spGirl); // 使用共享指针构造 wpGirl_1 = spGirl; // 允许共享指针赋值给弱指针
-
弱指针也可以获得引用计数; wpGirl_1.use_count()
-
弱指针不支持 * 和 -> 对指针的访问;
-
在必要的使用可以转换成共享指针 lock();