std::unique_ptr 的自定义删除器如何工作?

新手上路,请多包涵

根据 N3290, std::unique_ptr 在其构造函数中接受删除器参数。

但是,我无法在 Windows 中使用 Visual C++ 10.0 或 MinGW g++ 4.4.1,也无法在 Ubuntu 中使用 g++ 4.6.1。

因此,我担心我对它的理解是不完整或错误的。我看不出明显被忽略的删除参数的意义,所以任何人都可以提供一个有效的例子吗?

最好我也想看看它是如何工作的 unique_ptr<Base> p = unique_ptr<Derived>( new Derived )

可能使用标准中的一些措辞来支持示例,即无论您使用什么编译器,它实际上都在做它应该做的事情?

原文由 Cheers and hth. - Alf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 951
2 个回答

这在 MSVC10 中对我有用

int x = 5;
auto del = [](int * p) { std::cout << "Deleting x, value is : " << *p; };
std::unique_ptr<int, decltype(del)> px(&x, del);

在 gcc 4.5 上, 这里

我将跳过标准,除非您认为该示例没有完全按照您的预期进行。

原文由 Benjamin Lindley 发布,翻译遵循 CC BY-SA 3.0 许可协议

为了补充所有以前的答案,有一种方法可以使用自定义删除器,而不必“污染” unique_ptr 签名,方法是使用函数指针或类似的东西,如下所示:

 std::unique_ptr<MyType, myTypeDeleter> // not pretty

这可以通过为 std::default_delete 类模板提供完整的专业化来实现,如下所示:

 template<>
class std::default_delete<MyType>
{
public:
    void operator()(MyType *ptr) const
    {
        delete ptr;
    }
};

现在所有 std::unique_ptr<MyType> “看到”这个专业化将被删除。请注意,这可能不是您想要的所有 std::unique_ptr<MyType> ,因此请仔细选择您的解决方案。

原文由 Philippe Cayouette 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题