用dw做网站的空格怎么打,网站建设可以帮助企业,小程序助手app下载,手机商城设计shared_ptr共享它指向的对象#xff0c;多个shared_ptr可以指向#xff08;关联#xff09;相同的对象#xff0c;在内部采用计数机制来实现。 当新的shared_ptr与对象关联时#xff0c;引用计数增加1。 当shared_ptr超出作用域时#xff0c;引用计数减1。当引用计数变为…shared_ptr共享它指向的对象多个shared_ptr可以指向关联相同的对象在内部采用计数机制来实现。 当新的shared_ptr与对象关联时引用计数增加1。 当shared_ptr超出作用域时引用计数减1。当引用计数变为0时则表示没有任何shared_ptr与对象关联则释放该对象。
一、基本用法
shared_ptr的构造函数也是explicit但是没有删除拷贝构造函数和赋值函数。
1初始化
方法一 shared_ptr p0(new AA(“西施”)); // 分配内存并初始化。 方法二 shared_ptr p0 make_shared(“西施”); // C11标准效率更高。 shared_ptr pp1make_shared(); // 数据类型为int。 shared_ptr pp2 make_shared(); // 数据类型为AA默认构造函数。 shared_ptr pp3 make_shared(“西施”); // 数据类型为AA一个参数的构造函数。 shared_ptr pp4 make_shared(“西施”,8); // 数据类型为AA两个参数的构造函数。 方法三 AA* p new AA(“西施”); shared_ptr p0§; // 用已存在的地址初始化。 方法四 shared_ptr p0(new AA(“西施”)); shared_ptr p1(p0); // 用已存在的shared_ptr初始化计数加1。 shared_ptr p1p0; // 用已存在的shared_ptr初始化计数加1。
2使用方法
智能指针重载了*和-操作符可以像使用指针一样使用shared_ptr。 use_count()方法返回引用计数器的值。 unique()方法如果use_count()为1返回true否则返回false。 shared_ptr支持赋值左值的shared_ptr的计数器将减1右值shared_ptr的计算器将加1。 get()方法返回裸指针。 不要用同一个裸指针初始化多个shared_ptr。 不要用shared_ptr管理不是new分配的内存。
3用于函数的参数
与unique_ptr的原理相同。
4不支持指针的运算、-、、–
二、更多细节
1将一个unique_ptr赋给另一个时如果源unique_ptr是一个临时右值编译器允许这样做如果源unique_ptr将存在一段时间编译器禁止这样做。一般用于函数的返回值。 2用nullptr给shared_ptr赋值将把计数减1如果计数为0将释放对象空的shared_ptrnullptr。 3release()释放对原始指针的控制权将unique_ptr置为空返回裸指针。 4std::move()可以转移对原始指针的控制权。还可以将unique_ptr转移成shared_ptr。 5reset()改变与资源的关联关系。 pp.reset(); // 解除与资源的关系资源的引用计数减1。 pp. reset(new AA(“bbb”)); // 解除与资源的关系资源的引用计数减1。关联新资源。 6swap()交换两个shared_ptr的控制权。 void swap(shared_ptr _Right); 7shared_ptr也可象普通指针那样当指向一个类继承体系的基类对象时也具有多态性质如同使用裸指针管理基类对象和派生类对象那样。 8shared_ptr不是绝对安全如果程序中调用exit()退出全局的shared_ptr可以自动释放但局部的shared_ptr无法释放。 9shared_ptr提供了支持数组的具体化版本。 数组版本的shared_ptr重载了操作符[]操作符[]返回的是引用可以作为左值使用。 10shared_ptr的线程安全性 shared_ptr的引用计数本身是线程安全引用计数是原子操作。 多个线程同时读同一个shared_ptr对象是线程安全的。 如果是多个线程对同一个shared_ptr对象进行读和写则需要加锁。 多线程读写shared_ptr所指向的同一个对象不管是相同的shared_ptr对象还是不同的shared_ptr对象也需要加锁保护。 11如果unique_ptr能解决问题就不要用shared_ptr。unique_ptr的效率更高占用的资源更少。 示例1
#include iostream
#include memory
using namespace std;class AA
{
public:string m_name;AA() { cout m_name 调用构造函数AA()。\n; }AA(const string name) : m_name(name) { cout 调用构造函数AA( m_name )。\n; }~AA() { cout 调用了析构函数~AA( m_name )。\n; }
};int main()
{shared_ptrAA pa0(new AA(西施a)); // 初始化资源西施a。shared_ptrAA pa1 pa0; // 用已存在的shared_ptr拷贝构造计数加1。shared_ptrAA pa2 pa0; // 用已存在的shared_ptr拷贝构造计数加1。cout pa0.use_count() pa0.use_count() endl; // 值为3。shared_ptrAA pb0(new AA(西施b)); // 初始化资源西施b。shared_ptrAA pb1 pb0; // 用已存在的shared_ptr拷贝构造计数加1。cout pb0.use_count() pb0.use_count() endl; // 值为2。pb1 pa1; // 资源西施a的引用加1资源西施b的引用减1。pb0 pa1; // 资源西施a的引用加1资源西施b的引用成了0将被释放。cout pa0.use_count() pa0.use_count() endl; // 值为5。cout pb0.use_count() pb0.use_count() endl; // 值为5。
}推荐一个零声学院项目课个人觉得老师讲得不错分享给大家 零声白金学习卡含基础架构/高性能存储/golang云原生/音视频/Linux内核 https://xxetb.xet.tech/s/3Zqhgt