【问题标题】:customize std::shared_ptr deleter自定义 std::shared_ptr 删除器
【发布时间】:2017-07-17 02:51:11
【问题描述】:

C++ Primer 5th中,我看到过这样的事情:

shared_ptr<T> p(p2,d) p 是 shared_ptr p2 的副本,除了 p 使用可调用对象 d 代替 delete

但是当我测试它时:

#include <memory>
#include <iostream>

class DebugDelete {
public:
    DebugDelete(std::ostream &o = std::cerr) : os(o) {}
    template <typename T> void operator()(T *p) const
    {
        os << "delete unique_ptr" << std::endl;
        delete p;
    }
private:
    std::ostream &os;
};

int main()
{
    std::shared_ptr<int> sptr, sptr1(sptr, DebugDelete());
}

我引用的内容似乎有误,sptr1(sptr, DebugDelete()) 不起作用,但 sptr1(new int(42), DebugDelete()) 效果很好。

那么是否允许像 C++ Primer 5th 中那样使用shared_ptr 和删除器来构造share_ptr? 谢谢。

【问题讨论】:

  • 如果有一个构造函数采用shared_ptr 和一个自定义删除器,那么您可以让两个不同的shared_ptrs 共享同一个对象的所有权,但使用两个不同的删除器。销毁对象时应该使用哪个?
  • @aschepler 很好地解释了为什么不能像这样构造shared_ptr

标签: c++ c++11 shared-ptr


【解决方案1】:

shared_ptr constructors

对于编译的情况:

std::shared_ptr<int> sptr, sptr1(new int(42), DebugDelete());

它使用第四个构造函数:

template&lt; class Y, class Deleter &gt; shared_ptr( Y* ptr, Deleter d ); (4)

对于你提到的另一种情况:

std::shared_ptr<int> sptr, sptr1(sptr, DebugDelete());

它不能使用这个构造函数,因为你没有传递一个指针,你传递的是一个不同的shared_ptr 对象。

再往下看,没有一个构造函数与这里的参数匹配,因此最终会出现编译错误。该代码不符合标准,这让我相信它与书中的内容略有不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多