C ++自定义删除链接?

时间:2015-09-15 18:57:20

标签: c++

我有一个带有自定义删除器的共享指针,并且希望使用自定义删除器创建另一个共享指针,该自定义删除器在调用原始自定义删除器之前执行某些操作。有点像...

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的副本,但我不确定类型声明的样子。

2 个答案:

答案 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不能有不同的删除器。并且为了响应在超出范围之前做一些工作(另一个删除器的原因),如果你想在删除它之前做一些额外的工作,那么你可以调用一个单独的函数来完成工作,直到结束范围。检查一些可能需要的条件,并在离开前完成这项工作。