使用自定义删除器提升scoped_ptr / scoped_array

时间:2011-04-15 19:34:50

标签: c++ boost smart-pointers

我不知道如何使用 scoped_ptr scoped_array 来使用自定义删除工具。也许有另一种实现允许控制删除类似于 shared_ptr

顺便说一句,为什么 shared_ptr 允许自定义删除,但 scoped_ptr 却不允许?好奇。

4 个答案:

答案 0 :(得分:5)

  

我看不到如何让scoped_ptrscoped_array使用自定义删除器

你不能。

  

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

如果您的编译器支持右值引用,而标准库实现实现std::unique_ptr,则可以使用它。

否则,boost::scoped_ptr实现非常简单。 The latest version不到100行简单代码。创建具有自定义删除器的自己的衍生物(通过模板参数静态或通过运行时提供的函数或函数动态)将非常简单。

答案 1 :(得分:3)

scoped_ptr不允许自定义删除。我可以假设的主要原因是,如果sizeof(T*)保持为boost::function<>,其大小将不等于shared_ptr

我认为最便携的选项是使用shared_ptr或编写自己的scoped_ptr来支持删除者。

答案 2 :(得分:3)

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

namespace boost {

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

} // namespace boost

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

答案 3 :(得分:1)

在Qt

中可以找到范围指针和范围数组的另一个实现

http://doc.qt.io/qt-5/qscopedpointer.html

它允许自定义删除。