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

发布于 2024-11-01 10:44:36 字数 228 浏览 5 评论 0原文

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

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

I don't see how to get scoped_ptr or scoped_array to use a custom deleter. Maybe there is another implementation which allows controlled deletion similar to shared_ptr?

Btw, why does shared_ptr allow custom deleter but scoped_ptr doesn't? Just curious.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

想念有你 2024-11-08 10:44:36

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

您不能。

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

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

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

I don't see how to get scoped_ptr or scoped_array to use custom deleter

You can't.

Maybe there is another implementation which allows controlled deletion similar to shared_ptr?

If your compiler supports rvalue references and your Standard Library implementation implements std::unique_ptr, you can use that.

Otherwise, the boost::scoped_ptr implementation is very straightforward. The latest version is less than 100 lines of simple code. It would be quite simple to create your own derivative that has a custom deleter (either a static via a template parameter or dynamic via a function or functor provided at runtime).

记忆消瘦 2024-11-08 10:44:36

scoped_ptr 不允许自定义删除器。我可以假设的主要原因是,如果它将 boost::function<> 保留为 sizeof(T*),那么它的大小将不等于 sizeof(T*) code>shared_ptr 确实如此。

我认为最可移植的选项是使用 shared_ptr 或编写自己的 scoped_ptr 支持删除器。

scoped_ptr doesn't allow custom deleter. The main reason as I can suppose is that its' size will not be equal to sizeof(T*) if it would keep a boost::function<> as shared_ptr does.

I think the most portable options are to use shared_ptr or to write your own scoped_ptr that will support deleters.

月亮坠入山谷 2024-11-08 10:44:36

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

namespace boost {

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

} // namespace boost

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

You can overload boost::checked_delete function, e.g.

namespace boost {

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

} // namespace boost

After overloading, scoped_ptr will call checked_delete rather than delete.

流星番茄 2024-11-08 10:44:36

作用域指针和作用域数组的另一个实现可以在 Qt

http://doc.qt.io 中找到/qt-5/qscopedpointer.html

它允许自定义删除器。

Another implementation of scoped pointer and scoped array is found in Qt

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

It allows for custom deleter.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文