一、介绍
智能指针的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博客