【C++学习】智能指针-shared_ptr

来源:互联网 发布:我的世界mac版整合包 编辑:程序博客网 时间:2024/06/06 00:42

C++智能指针

智能指针简介

C++很多强大的功能依赖指针来实现,然而指针又是最容易出错的,最容易出错的一点就是,当对象已经释放了,再用指针访问其内容,以此造成非法内存访问的错误。
在C++11中,引进了新的智能指针类型,它们用来管理动态对象,智能指针的行为类似于常规的指针,但是,它能够自动的释放所指的对象,以避免内存泄漏,新的标准库中,提供了3种类别的智能指针:
1, shared_ptr //允许多个指针指向同一个对象,
2 , unique_ptr //独占式的指向所指的对象,不能指向相同的对象。
3 , weak_ptr //伴随类,是一种弱引用,指向share-ptr所管理的对象。
这三个类别都存放在
#include< memory >头文件中。

share_ptr类

智能指针式模板,我们必须提供其指向的对象类型。

1.定义智能指针:

share_ptr<string> p1; //定义指向string类型的智能指针。share_ptr<list<string>> p2; //定义指向string列表类型的智能指针。

默认初始化的智能指针保存着一个空指针,
在条件判断中,使用智能指针,其效果是检测该指针是否为空指针。

2.判断智能指针是否指向空:

share_ptr<string> p1;if(!p1){    cout<<"p1 is point to null"<<endl;}

make_shared

1.创建智能指针:

share_ptr<string> p1=make_shared<string>("test share point");//用make_shared<T>模板函数创建智能指针。//也可以用auto智能指针来保存auto p2=make_shared<vector<string>>();

引用计数

我们可以认为智能指针所指向的对象都有相对应的一个关联的计数器,称之为引用计数
当我们拷贝一个shared_ptr时,其指向的对象的引用计数会递增,比如:
1.用一个shared_ptr 去初始化另一个shared_ptr指针;
2.将shared_ptr作为参数传给一个函数;
3.将shared_ptr作为函数的返回值;
而在下列的情况下,其引用计数会递减:
1.shared_ptr变量被赋予新值,则它之前指向的对象的引用计数就减一。
2.shared_ptr变量被销毁(如离开作用域),其指向的对象的引用计数也会减一。

当一个shared_ptr变量的引用计数变为0时,它将自动释放自己所指向的对象,而不用我们自己手动释放。

auto a=make_shared<int>(100);//定义智能指针auto b=make_shared<int>(200);//定义智能指针b=a;//指针从新指向新的对象。

上面的代码中,因为b指针被赋予新值,所以,它之前所指的对象的引用计算将从1变为0,自动释放其对象,而a所指向的对象的引用计数将从1变为2.

0 0
原创粉丝点击