我们可以根据不同类型的指针,写不同的删除器传递给unique_ptr来实现最终可以正确的释放资源
#include<iostream>
#include<memory>
using namespace std;
template<typename T>
class MyDelete
{
public:
void operator()(T *ptr)const
{
cout << "call MyDelete.operator()" << endl;
delete[]ptr;
}
};
template<typename T>
class MyFileDelete
{
public:
void operator()(T *ptr)const
{
cout << "call MyFileDelete.operator()" << endl;
fclose(ptr);
}
};
int main()
{
unique_ptr<int, MyDelete<int>> ptr1(new int[100]);
unique_ptr<FILE, MyFileDelete<FILE>> ptr2(fopen("data.txt", "w"));
return 0;
}
结果:
我们也可以使用lambda表达式和function函数对象来实现上述功能
int main()
{
/*unique_ptr<int, MyDelete<int>> ptr1(new int[100]);
unique_ptr<FILE, MyFileDelete<FILE>> ptr2(fopen("data.txt", "w"));*/
unique_ptr<int,function<void(int*)>> ptr1(new int[100],
[](int *p)->void
{
cout << "lambad call MyDelete.operator()" << endl;
delete[] p;
}
);
unique_ptr<FILE, function<void(FILE*)>> ptr2((fopen("data.txt","w")),
[](FILE *p)->void
{
cout << "lambad call MyFile.operator()" << endl;
fclose(p);
}
);
return 0;
}
结果: