自定义std :: shared_ptr删除

时间:2017-07-16 18:22:54

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

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

  

shared_ptr<T> p(p2,d) p是shared_ptr p2的副本,除了p使用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())效果不错。

允许使用shared_ptr和删除器来构建{em> C ++ Primer 5th 中的share_ptr吗? 感谢。

1 个答案:

答案 0 :(得分:2)

请看shared_ptr constructors

对于编译的情况:

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

它使用了第四个构造函数:

  

template< class Y, class Deleter > shared_ptr( Y* ptr, Deleter d );     (4)

对于另一个案例,你提到:

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

它无法使用此构造函数,因为您没有传递指针,而是传递了不同的shared_ptr对象。

进一步向下列表,没有任何构造函数匹配此处的参数,因此最终会出现编译错误。这段代码不符合标准,这使我相信它与书中的内容不同。