c++定制删除器

本文探讨了C++中定制删除器的概念,它利用了仿函数的特性。仿函数是一种可以像函数一样使用的对象,通过重载operator()实现。文中还给出了一个定制删除器的代码示例。

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

定制删除器其实是利用仿函数

一、仿函数是什么?

不是函数但可以像函数一样使用,因为重载了operator()

简单举例:

template<class T>
struct Less
{
	bool operator()(const T& l, const T& r)
	{
		return l < r;
	}
};

void Test2()
{
	Less<int>less1;
	cout << less1(1, 2) << endl;
}

二、具体场景

void Teat()
{
	shared_ptr<FILE>spl((FILE*)fopen("test.txt", "w"));
}

上述场景中将产生错误,因为用fopen打开,要用fclose关闭

三、定制删除器举例

代码如下:

template<class T>//注意这里有模版
struct Del
{
	void operator()(const T* ptr)
	{
		delete ptr;
	}
};



struct Free//注意这里没有模版
{
	void operator()(void* ptr)
	{
		free(ptr);
	}
};



struct Fclose
{
	void operator()(FILE* ptr)
	{
		fclose(ptr);
	}
};


template<class T,class Deleter=Del<T>>
class SharedPtr
{
public:
	SharedPtr(T* ptr, Deleter del)
		:_ptr(ptr)
		, _pCount(new long(1))
		, _del(del)
	{}
	SharedPtr(T* ptr)
		:_ptr(ptr)
		, _pCount(new long(1))
	{}
	~SharedPtr()
	{
		_Release();
	}
protected:
	void _Release()
	{
		if (--*_pCount == 0)
		{
			_del(_ptr);
			delete _pCount;
		}
	}
private:
	T* _ptr;
	long* _pCount;
	Deleter _del;
};


测试用例:

void Test()
{
	SharedPtr<int>sp1(new int(1));
	SharedPtr<int,Free>sp2((int*)malloc(sizeof(int) * 10), Free());//注意怎么调用的
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值