智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr

RAII(Resource Acquisition Is Initialization)

资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。

所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。

STL--auto_ptr

Boost库的智能指针(ps:新的C++11标准中已经引入了unique_ptr/shared_ptr/weak_ptr)

常见的智能指针有:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array。

下面介绍三种智能指针auto_ptr,scoped_ptr,shared_ptr。

//智能指针AutoPtr
template<class T>
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 (this != &ap)
		{
			delete _ptr;
			_ptr = ap._ptr;
			ap._ptr = NULL;
		}
		return *this;
	}
	~AutoPtr()
	{
		cout << "~AutoPtr()" << endl;
		if (_ptr)
		{
			delete _ptr;
			_ptr = NULL;
		}
	}
private:
	T* _ptr;
};

//智能指针ScopedPtr
template<class T>
class ScopedPtr
{
public:
	ScopedPtr(T* ptr)
	    :_ptr(ptr)
	{}
	~ScopedPtr()
	{
		cout << "~ScopedPtr()" << endl;
		if (_ptr)
		{
			delete _ptr;
			_ptr = NULL;
		}
	}
protected://防拷贝:此处为privated或protecte;拷贝构造和赋值函数只声明不定义
	ScopedPtr(const ScopedPtr<T> &sp);
	ScopedPtr<T>& operator==(const ScopedPtr<T> &sp);
private:
	T* _ptr;
};

//智能指针SharedPtr
template<class T>
class SharedPtr
{
public:
	SharedPtr()
		:_ptr(NULL)
		, _pCount(new long(1))
	{}
	SharedPtr(T* ptr)
		:_ptr(ptr)
		, _pCount(new long(1))
	{}
	//----引用计数浅拷贝
	SharedPtr(const SharedPtr<T> &sp)
		:_ptr(sp._ptr)
		, _pCount(sp._pCount)
	{
		++(*_pCount);
	}
	SharedPtr<T>& operator=(const SharedPtr<T> &sp)
	{
		if (this != &sp)
		{
			Release();
			_ptr = sp._ptr;
			_pCount = sp._pCount;
			++(*_pCount);
		}
		return *this;
	}
	////用深拷贝
	////传统写法
	//SharedPtr<T>& operator=(const SharedPtr<T>& sp)
	//{
	//	if (this != &sp)
	//	{
	//		SharedPtr<T> tmp(sp);
	//		swap(_ptr, tmp._ptr);
	//		swap(_pCount, tmp._pCount);
	//	}
	//	return *this;
	//}
	//现代写法
	//SharedPtr<T>& operator=(SharedPtr<T> sp)
	//{
	//	swap(_ptr, sp._ptr);
	//	swap(_pCount, sp._pCount);
	//	return *this;
	//}
	~SharedPtr()
	{
		cout << "~SharedPtr()" << endl;
		Release();
	}
	T& operator*()
	{
		return *_ptr;
	}
	T* GetPtr()//返回原指针_ptr
	{
		return  _ptr;
	}
	T* operator->()
	{
		return _ptr;
	}
	long GetCount()//返回同一内存的指向数
	{
		return *_pCount;
	}
	void Release()//释放内存
	{
		if (--(*_pCount) == 0)
		{
			delete _ptr;
			delete _pCount;
			_ptr = NULL;
			_pCount = NULL;
		}
	}
private:
	T* _ptr;
	long* _pCount;
};

测试用例如下:

void  Test()
{
	AutoPtr<int> ap1(new int(3));
	AutoPtr<int> ap2 = ap1;
	AutoPtr<int> ap3(new int(5));
	ap3 = ap2;

	ScopedPtr<int> sp1(new int(3));
	//防拷贝
	//ScopedPtr<int> sp2 = sp1;
	//sp2 = sp1;

	SharedPtr<int> shp1(new int(3));
	SharedPtr<int> shp2 = shp1;
	SharedPtr<int> shp3(new int(5));
	shp3 = shp1;
	*shp1 = 6;
	cout << &shp1 << endl;
	cout << shp1.GetCount() << endl;
	cout << *(shp1.GetPtr()) << endl;//输出_ptr的值
	cout << *(shp1.operator->()) << endl;//输出_ptr的值
}

模板的分离编译

1、在模板头文件 xxx.h 里面显示实例化->模板类的定义后面添加 template class SeqList<int >; 一般不推荐这种方法,一方面老编译器可能不支持,另一方面实例化依赖调用者。(不推荐)

2、将声明和定义放到一个文件 "xxx.hpp" 里面,推荐使用这种方法。

时间: 2024-10-11 22:54:06

智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr的相关文章

智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr

RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 智能指针:用自动化或者说智能的指针来实现对动态内存的释放.它是一个类,有类似指针的功能. 常见的智能指针:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,由于scoped_array和scoped_

【C++】智能指针详解(三):scoped_ptr

在介绍scoped_ptr之前,我们先回顾一下前两篇文章的内容. 首先,智能指针采用RAII机制,通过对象来管理指针,构造对象时,完成资源的初始化;析构对象时,对资源进行清理及汕尾. auto_ptr,通过转移管理权来完成对象的拷贝与赋值,在实际开发中并不实用. 回顾完智能指针的背景及auto_ptr的特性之后,本文来介绍scoped_ptr的实现原理及特性. scoped_ptr与auto_ptr类似,但最大的区别就是它不能转让管理权.也就是说,scoped_ptr禁止用户进行拷贝与赋值. 诶

智能指针(一):STL auto_ptr实现原理

智能指针实际上是一个类(class),里面封装了一个指针.它的用处是啥呢? 指针与内存 说到指针自然涉及到内存.我们如果是在堆栈(stack)中分配了内存,用完后由系统去负责释放.如果是自定义类型,就会自动的去调用你的析构函数. 但如果是在堆(heap)中分配了内存,也就是用malloc或者new.那只能自动手动的使用free或delete去释放.所以使用heap时处理的不好很容易出现啥内存泄露(内存没有释放掉).或者如果你delete一次了,但没让它赋值为0,然后再delete一次就导致未定义

深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)

1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1:做到指针进行共享 3. unique_ptr: 一个指针同时只能有一个使用者使用 4. weaked_ptr: 与shared_ptr搭配使用 1.1 weak_ptr 参考:https://zh.cppreference.com/w/cpp/memory/weak_ptr std::weak_ptr 是一种智能指针,它对被 std::sha

智能指针分析及auto_ptr源码

简介 C++没有内存自动回收机制,对堆内存的管理就是简单的new和delete,每次new出来的内存都需要手动delete释放.但由于忘记.流程复杂或者异常退出等,都有可能导致没有执行delete释放内存,造成内存泄漏. 在实际工程中,我们往往希望将精力放在应用层上而不是费劲心思处理语言的细枝末节(内存释放),于是就有了最原始的只能指针auto_ptr. 智能指针原理 智能指针是一种资源管理类,这个类在构造函数中传入一个原始指针,在析构函数中释放传入的指针.智能指针都是栈上的对象,所以当函数(或

c++智能指针的不断演化

RAII RAII资源分配即初始化,定义一个类来封装资源的分配和释放,在构造 函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 智能指针的引入: 由于return ,throw等关键字的存在,导致顺序执行流的错乱,不断的进行跳转,使开辟的空间 看似被释放,而实际上导致内存的泄露. 例如以下两个例子: void Test1() { int *p1 = new int(1); if (1) { return; } delete p1; } void DoSome

【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr

RAII(Resource Acquisition Is Initialization): 资源分配即初始化,定义封装一个类,用来实现调用构造函数时就可完成资源的分配和初始化,在调用析构函数就可完成资源的清理,以实现对资源的初始化和清理. 智能指针: 用自动化或者说智能的指针来实现对动态内存的释放. 它是一个类,有类似指针的功能. 常见的智能指针有:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,我们今天先讲以下三种. 一.Aut

智能指针学习笔记

1. 介绍 本文介绍智能指针的使用.智能指针是c++ 中管理资源的一种方式,用智能指针管理资源,不必担心资源泄露,将c++ 程序员 从指针和内存管理中解脱出来,再者,这也是c++发展的趋势(这话不是我说的,见<Effective c++>和<c++实践编程>),应该认真学习一下. 智能指针中,最有名的应该数auto_ptr,该智能指针已经被纳入标准库,只需要包含<memory>头文件即可以使用,另外,TR1文档定义的shared_ptr和weak_ptr也已经实现(我用

四种智能指针:auto_ptr,unique_ptr,shared_ptr,weak_ptr

stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针的使用总结 (1)auto_ptr 主要用于解决资源自动释放的问题.防止用户忘记delete掉new申请的内存空间.使用auto_ptr会在离开变量的作用域之后直接调用析构函数进行资源释放. void Function() { auto_ptr<Obj> ptr(new Obj(20)); ... if (error occur) throw exception... } 但是,这是一种被c++1