c++ 智能指针删除器
2022-11-14 本文已影响0人
arkliu
默认情况下,智能指针过期的时候, 用delete删除原始指针,释放它管理的资源
不过我们可以自定义删除器,改变智能指针释放资源的行为
删除器可以是全局函数,仿函数,lambda表达式,形参为原始指针
// 删除器,普通函数
void deletefun(Cat *cat) {
cout << "删除器,普通函数:"<<cat->get_name() << endl;
delete cat;
}
// 删除器,仿函数
struct deleteClazz {
void operator()(Cat *cat) {
cout << "删除器,仿函数:"<<cat->get_name() << endl;
delete cat;
}
};
// 删除器,lambda表达式
auto deletelambda = [](Cat *cat) {
cout << "删除器,lambda表达式:"<<cat->get_name() << endl;
delete cat;
};
int main() {
// shared_ptr<Cat>pa0(new Cat("莉莉")); // 使用缺省的删除器
// shared_ptr<Cat>pa1(new Cat("莉莉"), deletefun); // 删除器,普通函数
// shared_ptr<Cat>pa1(new Cat("莉莉"), deleteClazz()); // 删除器,仿函数
// shared_ptr<Cat>pa2(new Cat("莉莉"), deletelambda); // 删除器,lambda表达式
// unique_ptr<Cat>pa0(new Cat("莉莉")); // 使用缺省的删除器
// 删除器,普通函数,使用decltype推导函数类型
// unique_ptr<Cat, decltype(deletefun)*>pa1(new Cat("莉莉"), deletefun);
// 删除器,普通函数,也可以写函数指针
// unique_ptr<Cat, void(*)(Cat *)>pa2(new Cat("莉莉"), deletefun);
// unique_ptr<Cat, deleteClazz>pa3(new Cat("莉莉"), deleteClazz()); // 删除器,仿函数
unique_ptr<Cat, decltype(deletelambda)>pa4(new Cat("莉莉"), deletelambda); // 删除器,lambda表达式
return 0;
}