使用智能指针需要添加头文件:

代码如下:

#include <memory>

shared_ptr使用的注意事项:
1.不能使用一个原始地址初始化多个共享智能指针
2.函数不能返回管理了this的共享智能指针对象
3.共享智能指针不能循环引用

初始化:

1.通过构造函数初始化

代码如下:

std::shared_ptr<T> 智能指针名字(创建堆内存)

2.通过拷贝和移动构造函数初始化

代码如下:

#include <iostream>
#include <memory>
using namespace std;int main()
{// 使用智能指针管理一块 int 型的堆内存, 内部引用计数为 1shared_ptr<int> ptr1(new int(520));cout << "ptr1管理的内存引用计数: " << ptr1.use_count() << endl;//调用拷贝构造函数shared_ptr<int> ptr2(ptr1);cout << "ptr2管理的内存引用计数: " << ptr2.use_count() << endl;shared_ptr<int> ptr3 = ptr1;cout << "ptr3管理的内存引用计数: " << ptr3.use_count() << endl;//调用移动构造函数shared_ptr<int> ptr4(std::move(ptr1));cout << "ptr4管理的内存引用计数: " << ptr4.use_count() << endl;std::shared_ptr<int> ptr5 = std::move(ptr2);cout << "ptr5管理的内存引用计数: " << ptr5.use_count() << endl;return 0;
}/*作者: 苏丙榅
链接: https://subingwen.cn/cpp/shared_ptr/#1-2-%E9%80%9A%E8%BF%87%E6%8B%B7%E8%B4%9D%E5%92%8C%E7%A7%BB%E5%8A%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%88%9D%E5%A7%8B%E5%8C%96
来源: 爱编程的大丙*/

3.通过std::make_shared初始化

代码如下:

通过 C++ 提供的 std::make_shared() 就可以完成内存对象的创建并将其初始化给智能指针,函数原型如下:

template<typename T,typename ...Args>
shared_ptr<T>make_shared(Args&&...args);
  • T:模板参数的数据类型
  • Args&&… args :要初始化的数据,如果是通过 make_shared 创建对象,需按照构造函数的参数列表指定

4.通过reset方法初始化

共享智能指针类提供的 std::shared_ptr::reset 方法函数原型如下:

void reset() noexcept;template< class Y >
void reset( Y* ptr );template< class Y, class Deleter >
void reset( Y* ptr, Deleter d );template< class Y, class Deleter, class Alloc >
void reset( Y* ptr, Deleter d, Alloc alloc );/*作者: 苏丙榅
链接: https://subingwen.cn/cpp/shared_ptr/#1-3-%E9%80%9A%E8%BF%87std-make-shared%E5%88%9D%E5%A7%8B%E5%8C%96
来源: 爱编程的大丙*/
  • ptr:指向要取得所有权的对象的指针
  • d:指向要取得所有权的对象的指针
  • aloc:内部存储所用的分配器

reset两个功能:

1.让指向某块内存的智能指针解除对这片内存的管理

2.通过reset调用,让一个指向某块内存的智能指针指向另块一块内存,也就是让它去管理另外一块内存。

两个函数:

如果想要查看当前有多少个智能指针同时管理着这块内存可以使用共享智能指针提供的一个成员函数 use_count,函数原型如下:

// 管理当前对象的 shared_ptr 实例数量,或若无被管理对象则为 0。
long use_count() const noexcept;

获取原始指针

对应基础数据类型来说,通过操作智能指针和操作智能指针管理的内存效果是一样的,可以直接完成数据的读写。但是如果共享智能指针管理的是一个对象,那么就需要取出原始内存的地址再操作,可以调用共享智能指针类提供的 get () 方法得到原始地址,其函数原型如下:

T* get() const noexcept;

代码如下:

#include <iostream>
#include <memory>
#include <string>
using namespace std;class Test
{public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num;
};int main()
{//通过构造函数初始化shared_ptr<int>ptr1(new int(3));cout << "ptr1 use_count = " << ptr1.use_count() << endl;//通过移动构造和拷贝构造函数初始化shared_ptr<int>ptr2 = move(ptr1);cout << "ptr1 use_count = " << ptr1.use_count() << endl;cout << "ptr2 use_count = " << ptr2.use_count() << endl;shared_ptr<int>ptr3 = ptr2;cout << "ptr3 use_count = " << ptr3.use_count() << endl;cout << "ptr2 use_count = " << ptr2.use_count() << endl;//通过std::make_shared初始化shared_ptr<int>ptr4 = make_shared<int>(8);shared_ptr<Test>ptr5 = make_shared<Test>(8);cout << "ptr5 use_count = " << ptr5.use_count() << endl;shared_ptr<Test>ptr6 = make_shared<Test>("hello");cout << "ptr6 use_count = " << ptr6.use_count() << endl;//通过reset初始化ptr6.reset();cout << "ptr6 use_count = " << ptr6.use_count() << endl;ptr5.reset(new Test("world"));cout << "ptr5 use_count = " << ptr5.use_count() << endl;return 0;
}

测试结果:

shared_ptr的使用:

代码如下:

#include <iostream>
#include <memory>
#include <string>
using namespace std;class Test
{public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num;
};int main()
{//通过构造函数初始化shared_ptr<int>ptr1(new int(3));cout << "ptr1 use_count = " << ptr1.use_count() << endl;//通过移动构造和拷贝构造函数初始化shared_ptr<int>ptr2 = move(ptr1);cout << "ptr1 use_count = " << ptr1.use_count() << endl;cout << "ptr2 use_count = " << ptr2.use_count() << endl;shared_ptr<int>ptr3 = ptr2;cout << "ptr3 use_count = " << ptr3.use_count() << endl;cout << "ptr2 use_count = " << ptr2.use_count() << endl;//通过std::make_shared初始化shared_ptr<int>ptr4 = make_shared<int>(8);shared_ptr<Test>ptr5 = make_shared<Test>(8);cout << "ptr5 use_count = " << ptr5.use_count() << endl;shared_ptr<Test>ptr6 = make_shared<Test>("hello");cout << "ptr6 use_count = " << ptr6.use_count() << endl;//通过reset初始化ptr6.reset();cout << "ptr6 use_count = " << ptr6.use_count() << endl;ptr5.reset(new Test("world"));cout << "ptr5 use_count = " << ptr5.use_count() << endl;//获取原始指针Test *t = ptr5.get();t->setValue(1000);t->print();//直接使用ptr5->setValue(999);ptr5->print();return 0;
}

[C++11]shared_ptr共享智能指针的初始化与使用相关推荐

  1. [C++11]弱引用智能指针weak_ptr初始化和相关的操作函数

    弱引用智能指针 std::weak_ptr 可以看做是 shared_ptr 的助手,它不管理 shared_ptr 内部的指针.std::weak_ptr 没有重载操作符 * 和 ->,因为它 ...

  2. C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

    目录 1.引言 2.什么是智能指针? 3.在Visual Studio中查看智能指针的源码实现 4.独占式指针unique_ptr 4.1.查看unique_ptr的源码实现片段 4.2.为什么uni ...

  3. 共享智能指针编程实验

    共享智能指针编程实验 基本知识 shared_ptr与make_shared initializer_list 自定义的StrBlob类 const限定符 示例代码 my_StrBlob.h main ...

  4. [C++11]共享智能指针shared_ptr指定删除器

    当智能指针管理的内存对应的引用计数变为 0 的时候,这块内存就会被智能指针析构掉了.另外,我们在初始化智能指针的时候也可以自己指定删除动作,这个删除操作对应的函数被称之为删除器,这个删除器函数本质是一 ...

  5. C++11新特性——智能指针之shared_ptr

    此课件及源代码来自B站up主:码农论坛,该文章仅作为本人学习笔记使用. 1.智能指针shared_ptr shared_ptr共享它指向的对象,多个shared_ptr可以指向(关联)相同的对象,在内 ...

  6. C++11 make_shared(智能指针初始化)

    智能指针可以智能地知道它是不是最后一个指向对象的指针,并且据此可以实现由对象的最后一个指针来决定对象的销毁. C++11提供两种智能指针(定义在<memory>): 1.shared_pt ...

  7. [C++11]独占的智能指针unique_ptr的初始化和使用

    std::unique_ptr 是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个 unique_ptr 赋值给另 ...

  8. c++ 智能指针_详解 C++ 11 中的智能指针

    C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置贬褒,手动分配内存与手动释放内 ...

  9. c++11中的智能指针

    在C++11中有四种智能指针,auto_ptr,shared-ptr,unique_ptr和weak-ptr,其中auto_ptr有许多不足之处,在C++11中已经建议废弃使用. 1. shared_ ...

最新文章

  1. python基础:条件循环字符串
  2. [渝粤教育] 郑州航空工业管理学院 航空概论 参考 资料
  3. 2021母婴行业洞察报告
  4. 如何造一个移动端的联动选择器(三)
  5. 记录一些移动开发的英文单词发音
  6. linux建模工具有哪些,linux uml 免费 建模工具
  7. 小姐姐の福音!美图旗下美妆相机推出AI新功能“发型管家”
  8. 服务器有效设置防止web入侵
  9. php 处理eml,PHP读取、解析eml文件及生成网页的方法示例
  10. 与矩阵的秩有关的结论
  11. 纪念数学家胡世华先生逝世20周年
  12. python operator用法_说说 Python 中的 Operator 模块
  13. Binary XML file line Error inflating class解决办法以及自定义view的基本实现
  14. alsa 麦克风采集音频
  15. es 启动elasticsearch.bat发生闪退
  16. 常见HTTP请求错误
  17. CheckBox选中触发事件 和 取消选中触发事件
  18. IOT-OS之RT-Thread(十三)--- 网络分层结构 + netdev/SAL原理
  19. 数学建模进入“新课标”,告别了“刷题”“押题”数学应该怎么学?
  20. war包报错xsd文件找不到的原因

热门文章

  1. LeetCode之Sum of Left Leaves
  2. 栈和队列之用2个栈实现一个队列
  3. okhttp上传图片和其他参数_Android中Okhttp3实现上传多张图片同时传递参数_放手_前端开发者...
  4. python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算
  5. linux生成地图,ROS中利用V-rep进行地图构建仿真
  6. 06-广度优先搜索:图、队列
  7. 研究表明:喝酒“上脸”是基因突变,不仅容易老年痴呆,还容易得胃癌
  8. 一篇论文未发博士毕业,中科院最年轻院士入职浙大
  9. 造作吧,Python快速入门!
  10. 百度地图大数据告诉你一线城市真相