std::unique_ptr
对于std::unique_ptr
,自定义删除器可以通过指定一个可调用对象来实现,可调用对象的类型可以是函数指针、函数对象或者lambda表达式等,通常使用lambda表达式比较方便。一般来说,lambda表达式的形式为:
[](T* p) { /* custom delete code */ }
其中,T
是指向被管理对象的指针类型,custom delete code
是用户定义的释放资源的代码。
std::unique_ptr
支持两种指定删除器的方式:一种是在声明unique_ptr
对象时通过构造函数指定,如:
std::unique_ptr<T, Deleter> ptr(new T, [](T* p) { /* custom delete code */ });
其中Deleter
是自定义删除器类型,ptr
是std::unique_ptr
对象名。
另一种是通过reset()
成员函数或release()
成员函数指定删除器,如:
ptr.reset(new T, [](T* p) { /* custom delete code */ });
ptr.release();
std::shared_ptr
对于std::shared_ptr
,自定义删除器的方式与std::unique_ptr
类似,可以使用lambda表达式或者其他可调用对象来实现,只需要在std::shared_ptr
对象的构造函数或reset()
成员函数中指定即可。需要注意的是,std::shared_ptr
的自定义删除器类型必须满足特定的要求,即必须有一个形参类型为被管理对象的指针类型,返回值类型为void
的operator()
成员函数。这是因为std::shared_ptr
的实现需要通过自定义删除器来管理引用计数等资源。
std::shared_ptr<T> ptr(new T, [](T* p) { /* custom delete code */ });
ptr.reset(new T, [](T* p) { /* custom delete code */ });
另外,对于std::shared_ptr
,还可以使用std::make_shared
函数来创建对象和智能指针,并通过其模板参数来指定自定义删除器,如:
std::shared_ptr<T> ptr = std::make_shared<T>(args..., [](T* p) { /* custom delete code */ });