自定义删除器
大约 1 分钟
自定义删除器
- 并不是说所有资源的释放都是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表达式的类型