关于auto_ptr

auto_ptr 代码及缺陷 auto_ptr是C++标准库里的类,它接受一个类型形参的模板,为动态分配的对象提供异常安全。其实,它的核心思想是:用一个对象存储需要被自动释放的资源,然后依靠对象的析构函数来释放资源,这是《More Effective C++》中的解释。下面给出它的一个简单实现,摘自《More 阅读详情

       智能指针auto_ptr 在我理解是用一个对象来管理原生指针,通过拥有权Owns的控制,在智能指针对象析构时来释放原生指针的空间,以此来保证内存总是被释放掉,避免内存泄露。

<span style="font-size:14px;">template<class _Ty>
	class auto_ptr {
public:
	typedef _Ty element_type;
	explicit auto_ptr(_Ty *_P = 0) _THROW0()
		: _Owns(_P != 0), _Ptr(_P) {}
	auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
		: _Owns(_Y._Owns), _Ptr(_Y.release()) {}
	auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
		{if (this != &_Y)
			{if (_Ptr != _Y.get())
				{if (_Owns)
					delete _Ptr;
				_Owns = _Y._Owns; }
			else if (_Y._Owns)
				_Owns = true;
			_Ptr = _Y.release(); }
		return (*this); }
	~auto_ptr()
		{if (_Owns)
			delete _Ptr; }
	_Ty& operator*() const _THROW0()
		{return (*get()); }
	_Ty *operator->() const _THROW0()
		{return (get()); }
	_Ty *get() const _THROW0()
		{return (_Ptr); }
	_Ty *release() const _THROW0()
		{((auto_ptr<_Ty> *)this)->_Owns = false;
		return (_Ptr); }
private:
	bool _Owns;
	_Ty *_Ptr;
	};</span>

拷贝构造函数
<span style="font-size:14px;">auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
		: _Owns(_Y._Owns), _Ptr(_Y.release()) {}</span>
当用一个智能指针拷贝构造另一个智能指针时,要考虑,如果在构造新的对象时只进行“浅拷贝”
_Owns=_Y._Owns;
_Ptr=_Y._Ptr;
这样会造成两个只能指针同时指向同一块内存且同时有拥有权,在这两个对象析构时会对同一块内存释放两次引发错误。

在成员初始化类表中先对_Owns赋值之后再对_Ptr赋值 并同时调动release()函数将_Y._Owns赋值为false,如果Y有拥有权,那么新对象将获得拥有权,然后Y失去拥有权,这样就避免两个对象对同一块内存都有拥有权的错误。但如果写成这样
<span style="font-size:14px;">auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
		:<span style="font-family: Arial, Helvetica, sans-serif;">_Ptr(_Y.release())</span>,_Owns(_Y._Owns),  {}</span>
看起来是Y先失去拥有权,再对_Owns赋值,似乎_Owns总是false.但在我自己写这个auto_ptr时确实把拷贝构造写成了上面的样子,但_Owns仍能被正确赋值。

也就是说_Owns(_Y._Owns)总是在_Ptr(_Y.release())前执行,因为成员初始化的顺序只与成员声明顺序有关与其在初始化列表中的顺序无关。
<span style="font-size:14px;">private:
	bool _Owns;
	_Ty *_Ptr;</span>
_Owns的初始化总早于_Ptr

赋值构造
<span style="font-size:14px;">auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
		{if (this != &_Y)
			{if (_Ptr != _Y.get())
				{if (_Owns)
					delete _Ptr;
				_Owns = _Y._Owns; }
			else if (_Y._Owns)
				_Owns = true;
			_Ptr = _Y.release(); }
		return (*this); }</span>
当用一个智能指针对象赋值另一个智能指针对象时同样要考虑_Owns的问题,不能两个对象对同一块内存都有拥有权,同时还要考虑被修改的这个指针原来管理的那块内存要释放掉。但源码中这种写法有一个小问题
int *p = new int(3);

auto_ptr<int> p2(p);
auto_ptr<int> p3(p2);//p2._Owns为false
auto_ptr<int> p4(p);
p4=p2;//////////////////////////在这用一个对p所指向空间没有拥有权的p2来给p4赋值,最后得到结果p4却是对此空间有拥有权的。。。  但如果p4也被赋值成无拥有权,那么又会有内存泄露,然后再想,那在被赋值前先释放掉那块内存好了,免得发生泄露,但这样做的结果是  经过这样的以此赋值,两个只能指针都指向了一块已经被释放的内存。源码这样写还是有他的道理的。

释放函数

<span style="font-size:14px;">_Ty *release() const _THROW0()
		{((auto_ptr<_Ty> *)this)->_Owns = false;
		return (_Ptr); }</span>

释放拥有权并返回指针
<span style="font-size:14px;">((auto_ptr<_Ty> *)this)->_Owns = false;</span>
那这语句为什么要进行强制类型转换,是为了去掉this指针的常性,从而能再const修饰的成员函数中修改_Owns
那既然要修改_Owns直接去掉const就好了 不用这么麻烦 。网上看会发现 在拷贝构造函数和赋值构造函数中都调用了_Y.release(),并且为了安全性考虑 参数_Y是一个常引用方式传进来的,所以_Y只能调用常方法,release()const  这个const是不能去掉的。
这时就需要在常方法中来改变成员变量,上边的强制类型转换是一种方法还可以通过关键字mutable来实现,mutalbe的意思是“可变的”,跟const是反义词。mutable是为了突破const的限制而设置的。被mutable修饰的变量将永远处于可变的状态,即使在一个const函数中。
private:
mutable bool  _Owns;
_Ty *_Ptr;

auto_ptr和unique_ptr auto_ptr是老版本的智能指针,当时还没有unique_ptr,shared_ptr,weak_ptr,现在auto_ptr已经被废弃,他有了更好用的替代品unique_ptr,相对于他的后继者,它有以下几个缺点。 1.auto_ptr可以进行赋值和拷贝运算,但是他虽然名义上做的是赋值和拷贝,但是背后做的却是move语义做的事情,拷贝和赋值之后,源对象被置位空,这看起来十分反常。而uniqu... 阅读详情

相关推荐

【STL源码剖析:auto_ptr】

STL auto_ptr源码

qq_43271867的博客 826

auto_ptr源码解析以及例子 --auto_ptr_ref

auto_ptr源码解析以及例子 -- 用例子说明auto_ptr_ref相关的转换函数的使用方法

Josan的博客 549

FDE现场部署工程师:MaaS时代AI落地的最后一公里

Model-as-a-Service(MaaS)正推动AI从云端能力向边缘与本地深度渗透,其核心挑战不在于模型本身,而在于如何将大语言模型、多模态理解、RAG等技术,可靠适配于真实世界的硬件限制、网络隔离、数据异构与业务逻辑。这一过程远超API调用范畴,涉及模型选型、量化部署、推理框架集成、私有知识库构建及跨系统协议对接。FDE(Field Deployment Engineer)作为关键角色,承担起连接算法与产线、代码与PLC、Prompt与PDF模板的‘上下文翻译’职责。本文聚焦MaaS现场落地中的典型

weixin_34218890的博客 606

auto_ptr中auto_ptr_ref的作用

auto_ptr_ref 作为 auto_ptr 的辅助类型,巧妙的解决了 auto_ptr 在拷贝赋值操作中遇到的障碍。1. 需要引入auto_ptr_ref 的原因。auto_ptr 作为一个类,应当可以作为右值传递给函数。而右值必须用常引用来指向, 因此需要将函数参数声明为常引用。但是如此,会出现麻烦的状况。一般的拷贝构造函数,不会改动传递进来的参数,但是 auto_ptr 的拷

H!Techer 1770

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

倍压整流电路设计

倍压整流电路利用二极管和电容的充放电特性实现电压提升,可分为二倍压、三倍压及多倍压结构。其工作原理是通过交流电正负半周交替对电容充电并叠加电压,具有结构简单、成本低的优点,但带载能力差且纹波较大。典型应用包括示波器、电蚊拍等小电流高压场景。设计时需重点考虑电容耐压、二极管选型和负载匹配,高频驱动可优化性能。该电路在低功耗高压电源中具有独特优势,但需注意安全防护与电压稳定性问题。

硬核科技 1708

【C++】智能指针——auto_ptr,unique_ptr,shared_ptr

1.智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时 ++或--,这个操作不是原子的,引用计数原来是1,++了两次,可能还是2.这样引用计数就错 乱了。旧的智能指针的会转移给新的智能指针,而旧的智能指针的会被置空。解决方案:在引用计数的场景下,把节点中的_prev和_next改成weak_ptr就可以了,weak_ptr不会增加引用计数,代码示意。该问题是有类似于链表节点的结构引起的,当外部的智能指针都释放了,就拿不内部的智能指针,那么节点就不会释放。使用方法参考官方文档。

2301_79796701的博客 1842

CMOS传输门(互补开关)实战指南 | 设计优化 + 常见问题解析

本文深入解析CMOS传输门(互补开关)的设计优化与常见问题,涵盖导通特性、版图设计、高频应用及混合信号设计等关键领域。通过实测数据和优化技巧,帮助工程师解决衬底连接、信号完整性等实际问题,提升数字和模拟混合信号设计的效率与可靠性。

weixin_29229989的博客 161

auto_ptr使用介绍

文章目录1 auto_ptr使用介绍 1 auto_ptr使用介绍 auto_ptr 是c++ 98定义的智能指针模板,其定义了管理指针的对象,可以将new 获得(直接或间接)的地址赋给这种对象。当对象过期时,其析构函数将使用delete 来释放内存! 使用建议: 尽可能不要将auto_ptr 变量定义为全局变量或指针。 除非自己知道后果,不要把auto_ptr 智能指针赋值给同类型的另外一个智能指针。 C++11 后auto_ptr 已经被“抛弃”,已使用unique_ptr替代! 示例代码如下: #

木子皿--啥都不会的菜鸟 1162

大模型部署之二--vllm+docker部署

本文介绍了在openEuler系统上快速本地部署Qwen3-8B、DeepSeek-R1、Qwen2.5deng 大模型的完整流程。通过modelscope管理模型,采用vllm+docker模式实现部署。主要步骤包括:1)安装conda环境;2)配置docker;3)下载模型;4)编写docker compose配置文件;5)启动服务。特别针对2卡4090服务器提供了参数配置建议,并给出常用命令和参考资料。文档还提示不同系统和平台可能存在差异,为开发者提供了本地部署大型语言模型的实用指南。

weixin_39279863的博客 1133

AI协议助手:法律文本解析与智能问答技术解析

自然语言处理(NLP)技术在法律文本解析中展现出巨大潜力,通过BERT等预训练模型实现条款分类与语义理解。结合OCR与知识图谱技术,AI协议助手能快速提取合同核心条款,并以问答形式解释法律术语,显著提升商务场景的决策效率。测试数据显示,该系统对NDA协议的识别准确率达92%,响应时间仅1.2秒,特别适用于人力资源竞业协议、云服务SLA评估等场景。随着RAG架构与法律术语向量库的应用,AI+法律正推动合同审核成本下降67%,未来将在跨境合规、智能谈判等方向持续演进。

weixin_29053577的博客 128

小议auto_ptr

    小议auto_ptr 一直以来都以为auto_ptr是个易用的东西,虽然一直都没有用过它.直到昨天,终于用了一下VC版本的auto_ptr,结果许多行为令人费解. 没有办法,又重新把STL参考书研究了一遍,随后把VC版的auto_ptr源码翻来研究了一番,原来是..... 有所得,总结了如下一些东东,望对初学者有所帮助.同时,若有不对的地方望各位大虾多指教.  详细解说见代码注解!

野草的专栏 1194

3DGS实战避坑指南:从零搭建到成功训练

本文详细介绍了3D Gaussian Splatting(3DGS)从环境配置到成功训练的实战避坑指南。涵盖git clone的正确使用、依赖安装的隐藏陷阱、CUDA版本兼容性解决方案、首次训练验证、常见报错急救方案、性能优化技巧及可视化调试方法,帮助开发者高效搭建和训练3DGS模型。

weixin_29053383的博客 365

auto_ptr的相关使用

auto_ptr的使用。

不积跬步无以至千里 605

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息

- 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。

一介草民,只为生活。 1187

基于YOLOv8的表面裂痕等缺陷检测:深度学习与UI界面的实践

本文详细介绍了如何使用YOLOv8进行表面裂痕等缺陷检测,并结合图形用户界面展示检测结果。通过YOLOv8的强大能力,我们可以实现高效、准确的表面缺陷检测,提升工业产品的质量控制水平。未来,随着深度学习技术和数据集的不断发展,表面缺陷检测的精度和速度将不断提升,应用领域也将进一步拓展。希望本文的实践能够为深度学习在工业检测领域的应用提供一些启示。

YOLO 549

auto_ptr 和 shared_ptr

智能指针

weixin_50993868的博客 545

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

auto_ptr与unique_ptr

auto_ptr与unique_ptr auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有两大问题: o 复制和赋值会改变资源的所有权,不符合人的直觉。 o 在 STL 容器中无法使用auto_ptr ,因为容器内的元素必需支持可复制(copy con

weixin_40081916的博客 5229

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

auto_ptr 基本用法

#include #include int main(){ double* pd = new double(77.77); std::cout << "*pd = " << *pd << std::endl; std::cout << "pd = " << pd << std::endl; // std::auto_ptr apd = p

生命不息, 战斗不止! 4831

auto_ptr_ref和auto_ptr的关系

 auto_ptr_ref和auto_ptr的关系 这是C++新闻组上一篇文章。它很好的解释了auto_ptr_ref和auto_ptr的之间的关系。你可以在google上查找 “auto_ptr_ref - anyone know what its about?”这个主题。此文章有删节。 1 问:对ANSI/ISO C++标准,我有两个问题,关于  auto_p

codingcoding的专栏 2213

unique_ptr优于auto_ptr的原因

第一个原因请看一段使用auto_ptr的代码://使用auto_ptr不当的后果 int main() { auto_ptr<int> aptr1(new int); auto_ptr<int> aptr2(new int); *aptr1 = 3; aptr2 = aptr1; cout << *aptr2 << endl; cout << *apt

crazy_father的博客 986

C++之智能指针auto_ptr

当你在读这篇文章的时候,应该都有这样一个疑问?那就是为什么要使用智能指针。 我们先看这样一个示例: #include <iostream> #include <string> #include <exception> using std::string; void memory_demo1() { string* str = new string("今天又找了一天的bug,太累了!!!"); std::cout << *str

DYDlove的博客 1905

auto_ptr、shared_ptr、weak_ptr、scoped_ptr用法小结

auto_ptr   auto_ptr是现在标准库里面一个轻量级的智能指针的实现,存在于头文件 memory中,之所以说它是轻量级,是因为它只有一个成员变量(拥有对象的指针),相关的调用开销也非常小。   下面的代码来自于VC++ 8.0里面的源码:     里面有个auto_ptr_ref的数据结构,我们可以把它忽略,这个只是内部使用的代理结构,用于一些隐式的const变化

水滴石穿 1万+

auto_ptr Vs. unique_ptr

auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有两大问题: o复制和赋值会改变资源的所有权,不符合人的直觉。 o在 STL 容器中无法使用auto_ptr ,因为容器内的元素必需支持可复制(copy constructable)和可赋值(assignable)。 unique_ptr特性 o 拥有它所指向的对象 o 无法进行复制构造,也无法进行复制赋值操作 o 保存指向某个..

一面之媛 505

auto_ptr解析

  auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使用它才能保证不出错,以至于它甚至无法适用于同是标准库中的那么多的容器和一些算法,但即使如此,我们仍然不能否认

877
上一篇: 从变量的声明和定义看指针与const
下一篇: 迷宫求解问题
github_24924857
博客等级 码龄12年 16粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值