繁体   English   中英

std :: unique_ptr,自定义删除器和类型更改

[英]std::unique_ptr, custom deleter and type change

我想将我的删除器与unique_ptr一起使用。 我希望带有删除程序的unique_ptr与带有默认删除程序的unique_ptr完全兼容。

我是这样做的:

template <typename T>
struct QObjectDeleteLaterDeletor :
        public std::default_delete<T>
{
    void operator()(T *p)
    {
        p->deleteLater();
    }
};

template <typename T, class... Args>
std::unique_ptr<T> qtMakeUniqueSpecial(Args&&... args)
{
    return std::unique_ptr<T>(
                new T(std::forward<Args>(args)...),
                QObjectDeleteLaterDeletor<T>());
}

这样可以编译,但是不起作用。 我的自定义删除器被忽略,默认使用它,好像我根本没有指定它。

我需要所有这些来做这样的事情:

auto ptr1 = qtMakeUniqueSpecial<MyObject>();
std::unique_ptr<MyObject> ptr2;
ptr2 = std::move(ptr1);

请注意,现在即使ptr1.reset()也会导致调用标准删除器,而不是我的删除器。

可能吗?

您需要指定QObjectDeleteLaterDeletor作为模板参数。 否则,将使用std::default_delete作为删除器,该删除器是从QObjectDeleteLaterDeletor切片复制的。

template <typename T, class... Args>
std::unique_ptr<T, QObjectDeleteLaterDeletor<T>> qtMakeUniqueSpecial(Args&&... args)
{
    return std::unique_ptr<T, QObjectDeleteLaterDeletor<T>> (
                new T(std::forward<Args>(args)...),
                QObjectDeleteLaterDeletor<T>());
}

请注意,您将ptr2声明为std::unique_ptr<MyObject> ,然后ptr2将通过std::default_delete破坏指针。 如果您声明其类型与ptr1一致,例如auto ptr2 = std::move(ptr1); 那就好了

您正在尝试使用

namespace std {
  template<typename T, typename Deleter = default_delete<T> >
  class unique_ptr;
}

它有第二个模板参数Deleter 如果未指定,则默认为std::default_delete<T> 您的密码

std::unique_ptr<T>(new T(std::forward<Args>(args)...),
                   QObjectDeleteLaterDeletor<T>());

const std::default_delete<T>&传递给std::unique_ptr<T>的构造函数,因为这是构造函数所期望的。 销毁(或调用成员reset() )后,将调用它。

注意std::shared_ptr的行为是不同的:删除器没有第二个模板参数,尽管在构造时可能会提供一个自定义删除器(这需要通过类型擦除来存储,这可以通过std::unique_ptr来避免。 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM