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

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

代码如下:

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人在职场,表达似水

最近几天集中在和部门内的小伙伴做1&#xff1a;1Talk。发现有不少人表达能力真的不是很好&#xff0c;而且水平长期停滞不前。现场与他们分享了一些我的经验&#xff0c;趁热打铁也想在这里分享给大家。表达能力不好本身就是做技术的人身上的一个常见标签。如果仅仅是标签也就…

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

弱引用智能指针 std::weak_ptr 可以看做是 shared_ptr 的助手&#xff0c;它不管理 shared_ptr 内部的指针。std::weak_ptr 没有重载操作符 * 和 ->&#xff0c;因为它不共享指针&#xff0c;不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;析构也不会减…

电子科技大学计算机网络技术专业,计算机专业前景如何?最强十大高校有哪些?电子科大排名多少?...

近几年计算机专业以及与计算机相关的专业可谓是火的不能再火&#xff0c;越来越多的考生在高考时选择了计算机专业或者与计算机相关的专业&#xff01;事实也是如此&#xff0c;随着科技的进步&#xff0c;信息技术的迅猛发展&#xff0c;特别是计算机技术的发展&#xff0c;以…

写一个简版 asp.net core

动手写一个简版 asp.net coreIntro之前看到过蒋金楠老师的一篇 200 行代码带你了解 asp.net core 框架&#xff0c;最近参考蒋老师和 Edison 的文章和代码&#xff0c;结合自己对 asp.net core 的理解 &#xff0c;最近自己写了一个 MiniAspNetCore &#xff0c;写篇文章总结一…

[C++11]独占的智能指针unique_ptr的删除器

unique_ptr 指定删除器和 shared_ptr 指定删除器是有区别的&#xff0c;unique_ptr 指定删除器的时候需要确定删除器的类型&#xff0c;所以不能像 shared_ptr 那样直接指定删除器&#xff0c;举例说明&#xff1a; 代码如下: #include <iostream> #include <memory…

如何在Windows上使用Git创建一个可执行脚本?

长话短说&#xff0c;今天介绍如何在windows上使用Git上创建一个可执行的shell脚本。“首先我们要知道windows上Git默认添加的文件权限是:-rw-r--r--(对应权限值是644)&#xff0c;而通常创建的shell脚本都希望天然可执行&#xff0c;故有必要在Windows上使用Git管理shell脚本时…

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

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

基于 abp vNext 和 .NET Core 开发博客项目 - 再说Swagger,分组、描述、小绿锁

在开始本篇正文之前&#xff0c;解决一个 疯疯过 指出的错误&#xff0c;再次感谢指正。步骤如下&#xff1a;删掉.Domain.Shared层中的项目引用&#xff0c;添加nuget依赖包Volo.Abp.Identity.Domain.Shared&#xff0c;可以使用命令&#xff1a;Install-Package Volo.Abp.Ide…

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

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

Abp v2.8.0发布 路线图

ABP框架和ABP商业版v2.8已经发布.这篇文章将涵盖这些发布中的新增内容和项目的中期路线图.ABP框架2.8有哪些新增内容?你可在GitHub的发行说明中看到所有的变更.这篇博客只包括重要的一些功能/变更.SignalR集成包我们已经发布了一个新的包用来集成SignalR到基于ABP框架应用程序…

贵州大学计算机专业的导师是谁,贵州大学计算机科学与信息学院导师介绍:王以松...

贵州大学计算机科学与信息学院导师介绍&#xff1a;王以松王以松&#xff0c;男&#xff0c;副教授&#xff0c;硕士研究生导师。主要研究方向&#xff1a;人工智能(知识表示与推理、逻辑程序设计)&#xff0c;语义网络等。 Em作者佚名次阅读2012-01-04王以松&#xff0c;男&am…

BitArray虽好,但请不要滥用,又一次线上内存暴增排查

一&#xff1a;背景1. 讲故事前天写了一篇大内存排查在园子里挺火&#xff0c;这是做自媒体最开心的事拉&#xff0c;干脆再来一篇满足大家胃口&#xff0c;上个月我写了一篇博客提到过使用bitmap对原来的List<CustomerID>进行高强度压缩&#xff0c;将原来的List内存压缩…

[翻译]用于.NET Core的Windows窗体设计器发布

本文由微信公众号《开发者精选资讯》翻译首发&#xff0c;转载请注明来源今天我们很高兴地宣布&#xff0c;.NET Core 项目的 Windows 窗体设计器现在可以在 Visual Studio 2019 16.6 版中作为预览使用&#xff01;我们在 Visual Studio 16.7 预览版 1 中也提供了更新的设计器版…

【视频回放与课件】零基础入门AI开发

今天上午&#xff0c;受广州图书馆邀请&#xff0c;在第一讲《零代码上手人工智能》的基础上&#xff0c;以《零基础入门AI开发》为主题&#xff0c;分四步解锁人工智能学习的概念与开发工具&#xff0c;让您在一小时内轻松掌握人工智能开发要领。本次课程内容主要包括&#xf…

Redis背后的故事

导语Redis已成为世界上最受欢迎的数据库之一&#xff0c;但当初正是因为Sanfilippo对数据库“缺乏经验”&#xff0c;使他敢于打破“良好”数据库工程的各种神圣规则&#xff0c;创建了Redis。正文如果Redis之父萨尔瓦多桑菲利波普&#xff08;Salvatore Sanfilippo&#xff09…

C++实现AOE网中的关键路径算法(邻接表存储)

代码如下: #include <iostream> #include <stack> #include <string> using namespace std; const int N 10010; using vnodeType int;typedef struct Node {int adj;int tw;//弧的时间权值Node *next; }Node;typedef struct Vnode {vnodeType v;//存储图…