智能指针的deleter机制

智能指针如std::unique_ptr和std::shared_ptr使用deleter机制在引用计数为0时自动释放内存。std::unique_ptr默认使用std::default_delete,可自定义deleter,如使用lambda表达式。std::shared_ptr同样允许自定义deleter,在所有拥有者析构后释放资源。
摘要由CSDN通过智能技术生成

一、介绍

智能指针的deleter机制是指,当智能指针的引用计数降为0时,智能指针会自动调用一个指定的析构函数(deleter)来释放所管理的内存。这个析构函数通常是一个函数对象,可以是一个函数指针、一个lambda表达式或者一个重载了函数调用运算符的类对象。智能指针的deleter机制可以确保在任何情况下都能正确地释放内存,包括在异常情况下和多线程环境下。

二、std::unique_ptr 的 deleter 机制

智能指针的deleter机制是指用于管理资源释放的方式。不同类型的智能指针有不同的deleter机制

unique_ptr 在 <memory> 中的定义如下:

// non-specialized

template <class T, class D = default_delete<T>> class unique_ptr;

// array specialization

template <class T, class D> class unique_ptr<T[],D>;

其中 T 指其管理的对象类型,D 指该对象销毁时所调用的释放方法,可以使用自定义的删除器,他也有一个默认的实现,即 detele 操作。

默认情况下,std::unique_ptr 使用 std::default_delete 作为其 deleter,它会调用 delete 来释放资源。例如:

std::unique_ptr<int> ptr(new int);  // 使用 std::default_delete 作为 deleter

 自定义deleter

int main()
{
    {
        std::unique_ptr<int,void(*)(int*)> ptr(new int(10), [] (int* p) {
            std::cout << "delete resource value " << *p << std::endl;
            delete p;
        });  // 使用 lambda 表达式作为自定义 deleter
    }

    system("pause");
    return 0;
}

三、std::shared_ptr 的 deleter 机制

  • std::shared_ptr 是一种共享所有权的智能指针,可以在多个 std::shared_ptr 之间共享资源。
  • std::shared_ptr 的 deleter 是通过模板参数指定的类型,默认情况下使用 std::default_delete
  • std::shared_ptr 的 deleter 机制是在最后一个持有资源的 std::shared_ptr 被销毁时释放资源。
std::shared_ptr<int> ptr(new int);  // 使用 std::default_delete 作为 deleter

自定义 deleter:

  • 除了使用默认的 deleter,你也可以自定义 deleter 来管理资源的释放。自定义 deleter 可以是函数指针、函数对象或 lambda 表达式。
  • 自定义 deleter 可以在智能指针的构造函数中进行指定。
std::shared_ptr<int> ptr(new int, [](int* p) { delete p; });  // 使用 lambda 表达式作为自定义 deleter

总结来说,智能指针的 deleter 机制决定了在何时以及如何释放资源。std::unique_ptr 通过转移所有权或释放资源来释放资源,而 std::shared_ptr 则在最后一个持有资源的指针被销毁时释放资源。你可以使用默认的 deleter,也可以自定义 deleter 来管理资源的释放。 

 参考:

智能指针 unique_ptr 详解_顺其自然~的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值