使用自定义删除器增强scoped_ptr / scoped_array

Boost scoped_ptr / scoped_array with custom deleter

本文关键字:scoped ptr array 增强 自定义 删除      更新时间:2023-10-16

我不知道如何获得scoped_ptrscoped_array使用自定义删除器。也许还有另一种实现允许类似于shared_ptr的受控删除?

Btw,为什么shared_ptr允许自定义删除,但scoped_ptr不允许?只是好奇。

我不知道如何让scoped_ptrscoped_array使用自定义删除器

你不能。

也许有另一种实现允许类似shared_ptr的受控删除?

如果你的编译器支持右值引用,并且你的标准库实现实现了std::unique_ptr,你可以使用它。

否则,boost::scoped_ptr的实现非常简单。最新版本只有不到100行简单的代码。创建带有自定义删除器(通过模板参数创建静态删除器,或者通过运行时提供的函数或函子创建动态删除器)的派生程序非常简单。

scoped_ptr不允许自定义删除器。我能想到的主要原因是,如果它像shared_ptr那样保留boost::function<>,它的大小将不等于sizeof(T*)

我认为最便携的选择是使用shared_ptr或编写自己的scoped_ptr,将支持删除。

可以重载boost::checked_delete函数,例如

namespace boost {
template<>
void checked_delete (Foo* x)
{
    ....
}
} // namespace boost

重载后,scoped_ptr将调用checked_delete而不是delete。

Qt

中有另一种作用域指针和作用域数组的实现http://doc.qt.io/qt-5/qscopedpointer.html

允许自定义删除