gpt4 book ai didi

C++ 自定义删除器链接?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:46 24 4
gpt4 key购买 nike

我有一个带有自定义删除器的共享指针,我想用一个自定义删除器从它创建另一个共享指针,它在调用原始自定义删除器之前做一些工作。像...

std::shared_ptr<X> foo;

{
std::shared_ptr<X> bar(new X(), Deleter);

foo.reset(bar, My_Deleter(bar.get_deleter()));
}

当 bar 超出范围时,foo 不会发生任何事情。当 foo 超出范围时,My_Deleter 运行,然后调用 Deleter。

是否可以像这样链接自定义删除器? My_Deleter 在构造时存储了 Deleter 的拷贝,但我不确定类型声明会是什么样子。

最佳答案

调用 shared_ptr::get_deleter() 时必须指定删除器类型,因此必须相应地专门化自定义删除类。

而且我不确定您是否可以将 shared_ptr 对象传递给 reset()。它需要一个新的 T* 指针作为输入,并且 shared_ptr 不能隐式转换为 T*,AFAIK。只有构造函数、operator=()swap() 方法允许将 shared_ptr 作为输入来调用共享。 reset() documentation甚至对此发出警告:

If the object pointed to by ptr is already owned, the function results in undefined behavior.

因此您必须使用 operator=swap()bar 分配给 foo 以便barX 对象被共享。

尝试这样的事情:

template <typename T, class Deleter = std::default_delete<T> >
class My_Deleter
{
Deleter *chained_deleter;

My_Deleter(std::shared_ptr<T>& p)
: chained_deleter(std::get_deleter<Deleter>(p));
{
}

void operator()(T *ptr) const
{
//...

if (chained_deleter)
(*chained_deleter)(ptr);
}
};

std::shared_ptr<X> foo;
{
std::shared_ptr<X> bar(new X, Deleter);
foo = std::shared_ptr<X>(bar, My_Deleter<X, decltype<Deleter> >(bar));
}

但不确定这是否真的有效。这取决于 shared_ptr 在与不同的删除器共享同一对象指针时是否/如何保留原始删除器。我有一种感觉,当 bar 的原始 Deleter 超出范围并且无法安全链接时,它可能会丢失。

关于C++ 自定义删除器链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32593573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com