跳至主要內容

自定义删除器

张威大约 1 分钟c/c++智能指针lambda

自定义删除器

  • 并不是说所有资源的释放都是delete指针 进行释放的。
  • 比如说,用智能指针来托管数组的资源,delete就得加个中括号[]了,
  • 如果用智能指针管理的是文件资源,或者是其他资源,释放的方式不是delete。

作用:能保证资源的绝对释放

unique_ptr shared_ptr都可以提供自定义删除器,本质上也就是智能指针第二参数给函数对象类,在类的operator()运算符重载资源释放工作,用法见下方代码:

#include <iostream>
#include <vector>
#include <memory>
#include <functional>
#include <thread>
using namespace std;

template<typename T>
class MyDeletor
{
public:
	void operator()(T* ptr)const
	{
		cout << "call MyDeletor::operator()" << endl;
		delete[] ptr;
	}
};

template<typename T>
class MyFileDeletor
{
public:
	void operator()(T* ptr)const
	{
		cout << "call MyFileDeletor::operator()" << endl;
		fclose(ptr);
	}
};

int main()
{
	unique_ptr<int, MyDeletor<int>> ptr1(new int[100]);
	unique_ptr<FILE, MyFileDeletor<FILE>> ptr2(fopen("aaa.txt", "w"));
    
	//lambda表达式方法,lambda表达式也就是一个临时的函数对象
	unique_ptr<int, function<void(int*)>> ptr3(new int[100],
		[](int* p)->void {
			cout << "lambda!" << endl;
			delete[]p;
		});
	unique_ptr<FILE, function<void(FILE*)>> ptr4(fopen("aaa.txt", "w"),
		[](FILE* p)->void {
			cout << "FILE deleter lambda!" << endl;
			fclose(p);
		});
	
	return 0;
}

lamda表达式对象的类型如何确定?

function函数对象类型,可以留下lamda表达式的类型