自定义 std::shared_ptr 个删除器

customize std::shared_ptr deleter

C++ Primer 5th 中,我看到了这样的内容:

shared_ptr<T> p(p2,d) p is a copy of the shared_ptr p2 except that p uses that p uses the callable object d in place of 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 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 对象。

继续往下看,none 个构造函数与此处的参数匹配,因此您最终会遇到编译错误。该代码不符合标准,这让我相信它与书中的内容略有不同。