美文网首页
c++ 智能指针删除器

c++ 智能指针删除器

作者: arkliu | 来源:发表于2022-11-14 07:02 被阅读0次

默认情况下,智能指针过期的时候, 用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;
}

相关文章

网友评论

      本文标题:c++ 智能指针删除器

      本文链接:https://www.haomeiwen.com/subject/gtyhtdtx.html