auto_ptr的两种方案

方案一:

因为在类中对同一块空间的析构在一次以上,就会发生错误,所以在进行赋值和拷贝构造时(同一块空间有一个以上的指针指向),保证只有一个指针指向这块空间,对原指针赋空操作,这样在析构时一块空间只会被析构一次

class AutoPtr
{
public:
	//构造函数
	AutoPtr(T *ptr)
	:_ptr(ptr)
	{}
	//拷贝构造函数
	//管理权的转移
	AutoPtr(AutoPtr<T>& ap)
		:_ptr(ap._ptr)
	{
		ap._ptr = NULL;
	}
	//赋值语句
	AutoPtr<T>& operator=(AutoPtr<T>&ap)
	{
		if (&ap != this)//自赋值检测
		{
			delete _ptr;
			_ptr = ap._ptr;
			ap._ptr = NULL;
		}
		return *this;
	}
	//重载*
	 T&operator*()
	{
		 return *_ptr;
	}
	 //重载->
	 T*operator->()
	 {
		 return _ptr;
	 }
	 //析构函数
	~AutoPtr()
	{
		if (_ptr != NULL)
			delete _ptr;
	}
private:
	T* _ptr;
};
struct A
{
	int _a;
};
int main()
{
	AutoPtr<int>ap1(new int(1));//构造函数
	AutoPtr<int>ap2(ap1);//拷贝构造函数

	AutoPtr<int>ap3(new int(2));
	ap3 = ap2;//重载=
	*ap3 = 10;//重载*

	AutoPtr<A>ap4(new A);
	ap4->_a = 20;//重载->
	return 0;
}

方案二:

在原有的私有成员上添加一个bool类型的_owner成员,当这块空间有一个autoptr指向时,这个autoptr的_owner=TRUE,当出现一块空间有多个指针指向操作时,仅最新的对象的_owner成员为TRUE,其他均为FALSE.在析构时,只要找到_owner=TRUE的才进行析构,其他则不析构,这样保证了一块空间不会被析构多次。

template<class T>
class AutoPtr
{
public:
	//构造函数
	AutoPtr(T *ptr)
	:_ptr(ptr)
	, _owner(true)
	{}
	//拷贝构造函数
	AutoPtr(AutoPtr<T>& ap)
		:_ptr(ap._ptr)
	{
		ap._owner = false;
		_owner = true;
	}
	//赋值语句
	AutoPtr<T>& operator=(AutoPtr<T>&ap)
	{
		if (&ap != this)//自赋值检测
		{
			_owner = true;
			ap._owner = false;
			_ptr = ap._ptr;
		}
		return *this;
	}
	//重载*
	 T&operator*()
	{
		 return *_ptr;
	}
	 //重载->
	 T*operator->()
	 {
		 return _ptr;
	 }
	 //析构函数
	~AutoPtr()
	{
		if (_owner == true)
			delete _ptr;
	}
private:
	T* _ptr;
	bool _owner;
};
struct A
{
	int _a;
};
int main()
{
	AutoPtr<int>ap1(new int(1));//构造函数
	AutoPtr<int>ap2(ap1);//拷贝构造函数

	AutoPtr<int>ap3(new int(2));
	ap3 = ap2;//重载=
	*ap3 = 10;//重载*

	AutoPtr<A>ap4(new A);
	ap4->_a = 20;//重载->
	return 0;
}

比较:

在谷歌的说明中auto_ptr被禁止使用,如果一定要说那种方案好那我会选第一种,方案一是在方案二上的改进,由于方案二中的当_owner=true释放空间时,_owner=false的对象中指针则成为了野指针(释放完内存后未把内存置空)

时间: 2024-08-25 09:36:19

auto_ptr的两种方案的相关文章

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 对于IOC的原理,我们曾经写过一篇博文,[SSH进阶之路

HBase存储时间相关多列数据的两种方案

所谓“时间相关多列数据”指的是同一个Key下具有多个属性数据,并且这些数据与时间具有相关性,多数场景是该Key对应在不同时间时刻的行为数据.在实际应用中,这类数据很多,例如电子商务网站上用户最近一段时间浏览的宝贝集合.访问的URL列表等. 使用HBase存储此类数据时,有以下两种常用的方案: 多行单列 表结构设计 Row Key:用户标识ID + (Long.MAX_VALUE - timestamp) Column Family:’cf’ Column Qualifier:’’ Value:宝

PHP页面静态化:真静态的两种方案

---------------------------------------------------------------------------------------------- 方案1:如果静态文件存在,且生成时间30秒内,直接返回静态页面(有时间延迟)/*|------------------| <www.chenwei.ws>|------------------*/header('content-type:text/html;charset=utf-8'); $id = $_

Linux下实现秒级定时任务的两种方案

Linux下实现秒级定时任务的两种方案(Crontab 每秒运行): 第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command sleep XX //间隔秒数 done 第二种方案,使用crontab. 我们都知道crontab的粒度最小是到分钟,但是我们还是可以通过变通的方法做到隔多少秒运行一次. 以下方法将每20秒执行一次 crontab -e * * * * * /bin/date* * * * * sleep 20;

Linux系统中修改用户名的两种方案整理

在安装系统的时候,经常会无意识的随便起个用户名,后面如果发现该用户名不好或因为环境需要须重起个用户名,经过查找资料和亲自测试发现有两种方案可选:手动修改和使用usermod等命令自动修改. 方案一:手动修改各个关联用户文件 以root身份登录系统文件的修改需要root权限,这里不管是原root用户登录还是普通用户切换到root下都可以,只要有修改权限就行. 修改/etc/passwd这个文件中的用户名部分.用户组部分和主目录部分如我本来的用户名为hadoop,现在想修改为seed,则要修改下面部

apache两种方案三种方式实现反向代理tomcat

目录 1.概述 2.方案一:以proxy_module方式反向代理 3.方案二:以mod_jk方式反向代理 4.总结 1.概述 在前一博客(http://zhaochj.blog.51cto.com/368705/1639740)中实现了tomcat的在standalone模式下的部署,这样tomcat就身兼职两职,一方向要对http的请求作出响应,又要处理JSP程序,而处理http请求不是tomcat的强项,所以这样的请求就交给httpd.nginx这样的的专业处理http请求的套件来处理,而

java调用matlab函数接口的两种方案

Java 调用matlab 函数接口 Java调用matlab函数接口有两种方式: l 一种是通过matlab把函数打成jar包: l 一种是把matlab编译成dll后,用C++再封装成java能支持的数据类型的dll. 注意:不论用这两种方式中的哪一种,最终部署时都需要matlab环境(MCR,在matlab安装路径下有). 1. 方式一:matlab直接打jar包 1.1. 利用matlab自带工具打jar包 1.1.1. 建立jar包 在matlab的Commond Window中输入d

Android热修复:Andfix和Hotfix,两种方案的比较与实现

Andfix和hotfix是两种android热修复框架. android的热修复技术我看的最早的应该是QQ空间团队的解决方案,后来真正需要了,才仔细调查,现在的方案中,阿里有两种Dexposed和Andfix框架,由于前一种不支持5.0以上android系统,所以阿里系的方案我们就看Andfix就好.Hotfix框架算是对上文提到的QQ空间团队理论实现.本文旨在写实现方案,捎带原理. Andfix 引入 框架官网:https://github.com/alibaba/AndFix 介绍是用英文

状态与策略——审批操作的两种方案

审批操作是ERP或OA系统中必不可少的功能之一.这里介绍两种我设计的用于审批操作的方案,并借此就"状态模式"与"策略模式"提出一点自己的理解.    别问我为什么不使用工作流引擎等工具来实现审批功能.做第一版方案时,我孤陋寡闻得并不知道有这个东西.后来引入工作流框架会导致学习曲线骤然上扬,不太划算. 背景 背景无需过多介绍,不外乎有一些数据/任务/请求,需要由领导们点一下头或者按钮. 思路 由于孤陋寡闻,在得到需求之后,我第一反应不是"工作流",