我有一个带有自定义删除器的共享指针,并且希望使用自定义删除器创建另一个共享指针,该自定义删除器在调用原始自定义删除器之前执行某些操作。有点像...
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的副本,但我不确定类型声明的样子。
答案 0 :(得分:1)
您必须在调用shared_ptr::get_deleter()
时指定删除器类型,因此您必须相应地专门设置自定义删除类。
我不确定你是否可以将shared_ptr
对象传递给reset()
。它需要一个新的T*
指针作为输入,shared_ptr
不能隐式转换为T*
,AFAIK。只有构造函数operator=()
和swap()
方法允许shared_ptr
作为输入来调用共享。 reset()
documentation甚至对此发出警告:
如果ptr指向的对象已经拥有,该函数会导致未定义的行为。
因此,您必须使用operator=
或swap()
将bar
分配给foo
,以便共享bar'
个X
个对象。
尝试这样的事情:
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
可能会在超出范围且不能安全链接时丢失。
答案 1 :(得分:0)
由于shared_memory的删除器只能在分配内存时安全地设置,因此无法完成。不同的shared_ptrs不能有不同的删除器。并且为了响应在超出范围之前做一些工作(另一个删除器的原因),如果你想在删除它之前做一些额外的工作,那么你可以调用一个单独的函数来完成工作,直到结束范围。检查一些可能需要的条件,并在离开前完成这项工作。