C++ 智能指针shared_ptr的实现

C++智能指针shared_ptr的原理与实现 shared_ptr 是 C++ 标准库提供的一个智能指针类,它的原理基于引用计数(reference counting)。当我们使用 shared_ptr 管理一个对象时,实际上会有一个额外的数据结构来维护引用计数信息。这个计数器会记录有多少个 shared_ptr 实例共享同一个指针对象。在创建 shared_ptr 对象时,引用计数会初始化为 1。 阅读详情

转自:http://www.cnblogs.com/xuelisheng/p/9739812.html

#include <memory>
#include <iostream>
using namespace std;

template<typename T>
class smart
{
private:
	T* _ptr;
	int* _count; //reference couting

public:
	//构造函数
	smart(T* ptr = nullptr) :_ptr(ptr)
	{
		if (_ptr)
		{
			_count = new int(1);
		}
		else
		{
			_count = new int(0);
		}
	}

	//拷贝构造
	smart(const smart& ptr)
	{
		if (this != &ptr)
		{
			this->_ptr = ptr._ptr;
			this->_count = ptr._count;

			(*this->_count)++;
		}
	}

	//重载operator=
	smart operator=(const smart & ptr)
	{
		if (this->_ptr == ptr._ptr)
		{
			return *this;
		}
		if (this->_ptr)
		{
			(*this->_count)--;
			if (this->_count == 0)
			{
				delete this->_ptr;
				delete this->_count;
			}
		}
		this->_ptr = ptr._ptr;
		this->_count = ptr._count;
		(*this->_count)++;
		return *this;
	}

	//operator*重载
	T& operator*()
	{
		if (this->_ptr)
		{
			return *(this->_ptr);
		}
	}

	//operator->重载
	T& operator->()
	{
		if (this->_ptr)
		{
			return this->_ptr;
		}
	}

	//析构函数
	~smart()
	{
		(*this->_count)--;
		if (*this->_count == 0)
		{
			delete this->_ptr;
			delete this->_count;
		}
	}
	//return reference couting
	int use_count()
	{
		return *this->_count;
	}
};

int main()
{
	smart<int> sm(new int(10));
	cout << "operator*():" << *sm << endl;
	cout << "reference couting:(sm)" << sm.use_count() << endl;
	smart<int> sm2(sm);
	cout << "copy ctor reference couting:(sm)" << sm.use_count() << endl;
	smart<int> sm3;
	sm3 = sm;
	cout << "copy operator= reference couting:(sm)" << sm.use_count() << endl;
	cout << &sm << endl;
	return 0;
}

我按照原文博客把代码敲了一遍,运行结果:
在这里插入图片描述
转自:http://www.cnblogs.com/xuelisheng/p/9739812.html

C++ -- 智能指针 auto_ptr,unique_ptr,shared_ptr的简单实现和原理 一,RAII RAII–资源获取时就初始化,在构造函数中申请资源,在析构函数中释放资源。 简单模拟实现: template<class T> class smartptr { public: smartptr(T* ptr = nullptr) :_ptr(ptr) { cout << "smartptr(T* )" << endl; } ~sm... 阅读详情

相关推荐

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1476

C++智能指针之shared_Ptr的原理以及简单实现

所绑定的一种解决可能存在的资源泄露等问题的策略。能够自动管理内存的大致原理是:对象调用构造,资源就保存,对象不使用之后调用析构,则资源顺带释放。它允许多个指针同时共享同一个对象,同时确保当所有指向该对象的指针都被销毁时,该对象也会被正确地释放。​ 关于智能指针,它是一种C++对象,它的行为类似于指针,但是它具有自动管理内存的能力。智能指针常见的思想是。记录有多少个指针指向它,存在即+1,不指向则-1,归0后则释放资源。我们想要的计数器必须是同一份资源的计数器,而且是多个对象所共享的,所以。

专业而不失有趣的C++编程老师一枚~ 3607

Nexus3国内高速下载指南:多版本全平台资源汇总

本文针对国内开发者从官网下载Nexus 3速度慢、易失败的问题,提供了详尽的解决方案。汇总了Windows、Linux、macOS等多个平台的Nexus 3历史及最新版本(如3.31.1)的国内高速下载链接,并附有版本选择建议与Linux环境下的快速启动指南,帮助用户高效获取和部署这一流行的仓库管理工具。

jwt8token的博客 431

【C++智能指针】简易shared_ptr实现(手撕shared_ptr)

手撕实现简易的C++智能指针shared_ptr

weixin_43954810的博客 4419

使用 STM32F7 和 TensorFlow Lite 开发低功耗人脸识别设备

我们讨论了 STM32F7 的特点和能力,TensorFlow Lite 在 STM32F7 上的应用,以及一些降低功耗的优化技术。- 准备模型:选择合适的人脸识别模型,在 TensorFlow 中进行训练和导出,并使用 TensorFlow Lite 转换为适用于 STM32F7 的量化模型。请注意,上述代码仅展示了如何加载和运行 TensorFlow Lite 模型的方法,实际应用中需要集成人脸检测和识别模型,并根据实际需求进行相应的输入和输出处理。结合这两个工具,我们可以开发出低功耗的人脸识别设备。

weixin_66608063的博客 2583

AD9026芯片开发实战:从Example Code到API调用的关键步骤解析

本文详细解析了AD9026芯片开发的核心流程,重点阐述了如何从官方提供的Example Code入手,逐步理解硬件平台发现、HAL层初始化、配置加载、芯片复位、固件启动、JESD链路建立等关键API调用序列。通过剖析示例工程的结构与核心文件,为开发者在自定义硬件平台上移植和调试AD9026驱动提供了清晰的实战指南。

java5的博客 787

C++ 智能指针实现之shared_ptr

智能指针本质上并不神秘,其实就是 RAII 资源管理功能的自然展现而已。本文将介绍如何实现 C++中智能指针的 shared_ptr。多个不同的shared_ptr不仅可以共享一个对象,在共享同一对象时也需要同时共享同一个计数。当最后一个指向对象(和共享计数)的shared_ptr析构时,它需要删除对象和共享计数。我们实现了一个基本完整的带引用计数的shared_ptr智能指针。从而对智能指针有一个比较深入的理解。当然,这里与标准的还欠缺一些东西,比如多线程安全、不支持自定义删除器以及和的配合。

L-Super的博客 1476

用Python玩转Iris数据集:从数据加载到可视化分析的完整指南

本文提供了使用Python处理Iris数据集的完整指南,涵盖数据加载、探索性分析、特征工程和可视化呈现等关键步骤。通过Pandas、NumPy、Matplotlib和Seaborn等工具,读者将学习如何从零开始完成一个机器学习项目的数据分析流程,掌握数据科学的核心技能。

j2k3l4的博客 849

shared_ptr的简单实现

shared_ptr是c++中的一种常用智能指针,它能够解决C++程序员未及时释放内存空间导致的内存泄露问题。shared_ptr的实现核心是改变其中的引用计数值,下面是我实现的一个简单的shared_ptr,其中主要包括拷贝构造函数、赋值运算符等。 #include <iostream> using namespace std; template <typename T> class myshared_ptr { public: myshared_ptr(T*value) /

tp_0moyi0的博客 3591

使用xlwings在Python中对Excel表格进行操作是非常方便的,可以实现自动化处理、批量数据处理等功能

使用xlwings在Python中对Excel表格进行操作是非常方便的,可以实现自动化处理、批量数据处理等功能。本篇文章主要介绍如何使用xlwings对Excel表格进行多行多列数据设置和操作,并给出相应的源代码。接着,我们可以对这个范围内的所有单元格进行操作,如设置字体颜色、填充颜色、对齐方式等。以上就是使用xlwings对Excel表格进行多行多列数据操作和设置字体颜色、填充色和对齐方式的全部内容。最后,我们可以将数据写入到单元格中,也可以从单元格中读取数据。在Excel中,可以通过。

BUG?不存在的! 712

【花雕学编程】Arduino FOC 之AS5048A磁编码器模块

您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。

雕爷学编程 1496

C++之共享智能指针shared_ptr的实现

理解共享智能指针shared_ptr的计数器

m0_58495729的博客 3609

Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场实例分析(一)-差分过孔结构

Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(一)详细介绍了3D-EM Full Wave Extraction全波S参数提取,下面以一个差分过孔结构进行实例分析,以下图为例。模式如何进行S参数提取和观测3D电磁场和远场实例分析(一)-差分过孔结构。是一个简单的4层板,top换层到bottom层的差分过孔结构。起始频率为100Mhz,截止频率为20Ghz,线性扫描。上面那根曲线是插损,下面那根线是回损。

weixin_54787054的博客 342

【c++】【智能指针】shared_ptr底层实现

std::shared_ptr被销毁时,它会。

m0_64014551的博客 3273

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

shared_ptr 是C++中的智能指针类,通过引用计数机制管理堆内存对象的生命周期,并使用原子操作确保引用计数的线程安全性。它支持拷贝构造和赋值运算符重载,可以安全地共享指向同一块堆内存的对象。此外,shared_ptr提供了方便的访问和操作接口,是一种方便而安全的资源管理工具

Yawesh的博客 3687

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【C++】智能指针&&RALL&&实现shared_ptr

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.

zxctsclrjjjcph的博客 1315

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【C++入门到精通】智能指针 shared_ptr循环引用 | weak_ptr 简介及C++模拟实现 [ C++入门 ]

这篇文章介绍了std::shared_ptr循环引用问题以及解决方案std::weak_ptr。它解释了循环引用的概念,并提供了使用示例和模拟实现方法。通过阅读这篇文章,您将了解循环引用问题以及如何使用std::weak_ptr来解决该问题。

Yawesh的博客 3343

【C++】智能指针原理以及详解shared_ptr精简版实现

本文深入探讨C++智能指针的核心机制及其在内存管理中的应用。通过分析手动管理内存的复杂性,揭示内存泄漏的成因与危害,并介绍RAII原则如何通过对象生命周期自动化资源管理。重点解析unique_ptr的防拷贝设计、shared_ptr的引用计数实现及线程安全问题,结合代码示例演示智能指针的底层实现,包括引用计数管理、拷贝控制及线程安全优化。文章还对比了auto_ptr的缺陷与boost库的贡献,以及地址删除器最后通过实现一个支持原子操作的shared_ptr

2303_77756141的博客 1444

C++11智能指针(auto_ptr,unique_ptr,shared_ptr,weak_ptr的详解与模拟实现)

概念:RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:不需要显式地释放资源。采用这种方式,对象所需的资源在其生命期内始终保持有效。

yin_ming_hui的博客 1100

【C++11】智能指针的使用以及模拟实现(shared_ptr,unique_ptr,auto_ptr,weak_ptr)

我们下面所说的智能指针都是基于这种思想设计出来的。

m0_74774759的博客 469

C++11 智能指针:unique_ptr、shared_ptr和weak_ptr 功能特性 模拟实现

C++11 中的智能指针,unique_ptr、shared_ptr和weak_ptr的功能特性、使用场景、辅助函数及模拟实现。

有耐心做好简单事情,坚持写blog 1878

cpp教程11-手动实现自己的智能指针shared_ptr和 unique_ptr

背景 智能指针是管理操作内存的重要手段 现在我来实现两个重要的指针,分别是shared_ptr和 unique_ptr, 源代码代码和测试都有,代码中带有注释,因为时间关系,有空再补设计思路和原理吧。 shared_ptr 源代码 // // Created by zxzx on 2020/10/17. // #ifndef ZZZ_SharedPtr_H #define ZZZ_SharedPtr_H #include <iostream> #include <memory> #

搜索引擎预备工程师 742

[模拟实现]unique_ptr、shared_ptr智能指针--C++版本的代码实现

这里的引用计数必须实时的在每一个智能指针内部更新,所以我们需要将引用计数单独提取出来,而不是有一个新的智能指针就去挨个更改其他智能指针内部的引用计数的值。unique_ptr是在auto_ptr的基础之上,解决了多个智能指针同时指向一个对象,发生管理权转移,只有一个智能指针指向了对象,其他的都是管理的空对象的行为。不可以使用拷贝构造和赋值重载是因为使用之后,会产生智能指针管理空对象,如果在使用该智能指针的话,就会出现问题了,但是对于将亡值这类,就不存在了,这类对象的管理权转移给别人之后他们也就销毁了。

m0_74207969的博客 767

C++11: 智能指针(unique_ptr,shared_ptr和weak_ptr的使用及简单实现)

内存泄漏是指在程序运行过程中,由于疏忽或错误而未能释放不再使用的内存,导致这部分内存得不到回收。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,从而造成了内存的浪费。内存使用量增加:随着内存泄漏的累积,程序占用的内存会越来越多。程序性能下降:频繁的内存分配和释放可能导致内存碎片化,进而影响程序性能。系统资源耗尽:长时间运行的程序可能会耗尽系统内存,特别是对于操作系统游戏服务器数据库系统和客户端应用程序等关键任务程序,会导致响应越来越满,最终卡死。

2301_79171011的博客 1460

模拟实现C++智能指针shared_ptr和weak_ptr

当弱智能指针weak_ptr的引用计数为0时,析构引用计数对象\。当强智能指针shared_ptr的引用计数为0时,析构资源。

ljy的博客 428

C++ 实现智能指针:shared_ptr 和 unique_ptr

C++11 智能指针的深入分析,和动手实现简版的智能指针 std::shared_ptr 、std::unique_ptr

2912
上一篇: Linux命令——source
下一篇: Qt读取MD5
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值