引用计数的智能指针——sharedptr的模拟实现

本文介绍了一种名为智能指针的数据结构,它通过自动调用析构函数来避免资源泄漏问题。文章提供了智能指针的实现代码,并展示了如何根据不同类型的内存分配方式选择相应的释放方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在处理异常时,由于要抛出异常,经常导致申请空间未释放,打开的文件未关闭等情况,这时,智能指针便应运而生。

      智能指针功能和普通指针最大的区别就在于智能指针在退出堆栈时会自动调用析构函数而不会存在忘记释放空间的问题,而且它任然可以对指针进行赋值、解引用等操作。那就来简单的实现一下智能指针吧。

template
class SharedPtr
{
public:
	SharedPtr(T* ptr)                                //构造函数
		:_ptr(ptr), _refcount(new int(1))
	{
		cout << "construction"<< endl;
		;
	}
	SharedPtr(SharedPtr& sp)              //拷贝构造函数
		:_ptr(sp._ptr), _refcount(sp._refcount)
	{
		cout << "copy construction" << endl;
		(*_refcount)++;
	}
	SharedPtr& operator=(SharedPtr& sp)           //=运算符重载
	{
		if (*this != sp)
		{
			release();
			_ptr = sp._ptr;
			_refcount = sp._refcount;
			(*_refcount)++;
		}
		return *this;
	}
	~SharedPtr()                    //析构函数
	{
		release();
	}
	void release()            //释放空间在引用计数为1时
	{
		if (--(*_refcount) == 0)
		{
			cout << "delete:0x" << _ptr << endl;
			del(_ptr);
			delete _refcount;
		}
	}
	T& operator*()        //使智能指针也可以解引用
	{
		return *_ptr;
	}
	T* operator->()      //使智能指针也可以使用->
	{
		return _ptr;
	}

protected:
	T* _ptr;      //指针
	int* _refcount;//引用计数
	DEL del;//创建一个删除器对象
};

那么那个DEL类又有什么用呢?

DEL的存在是由于编译器并不清楚你申请内存的方式,也就不知道该如何释放他,而你就很有必要告诉编译器。删除器是仿函数的一个应用,仿函数其实是一个类,它实现了operator(),因此调用时看起来就和函数一样,所以叫仿函数。

//四个删除器 分别调用了delete,delete[],free(),和fclose()函数。
template
struct Del
{
	void operator()(T* ptr)
	{
		cout << "delete" << endl;
		delete ptr;
	}
};
template
struct DelArray
{
	void operator()(T* ptr)
	{
		cout << "delete[]" << endl;
		delete[] ptr;
	}
};
template
struct Free
{
	void operator()(T* ptr)
	{
		cout << "free" << endl;
		free( ptr);
	}
};
template
struct Fclose
{
	void operator()(T* ptr)
	{
		cout << "fclose" << endl;
		fclose(ptr);
	}
};
写的差不多了来测试一下子
void testsharedptr()
{
	SharedPtr<int, Del<int>> p1(new int(10));
	SharedPtr<int, DelArray<int>> p2(new int[10]);
	SharedPtr<FILE, Fclose<FILE>> p3(fopen("test1.txt", "w"));
	SharedPtr<int, Free<int>> p4((int*)malloc(10 * sizeof(int)));
	SharedPtr<int, Del<int>> p12 = p1;
}
最后看运行结果
正如预期,不同的申请方式也对应了不同的释放方式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值