unique_ptr:如何安全地共享原始指针

时间:2012-07-12 16:06:11

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

我正在创建一个由unique_ptr管理的类,但由于各种原因,我需要为实现提供对该对象的原始指针的访问权限。但是,我想确保用户不会无意中删除基础对象。我想出了以下示例代码:
(它是树结构的一部分,我需要能够查看树节点的成员而不实际分离它们。shared_ptr在这种情况下似乎有些过分。)

#include <memory>

using namespace std;

class unOnly
{
    ~unOnly() {}
public:
    unOnly() {}
    friend class default_delete<unOnly>;
};

int main()
{
    unique_ptr<unOnly> ptr(new unOnly());
}

这在gcc 4.4.5中为我编译。但是,我可以确定在所有实现中default_delete实际上是delete对象,而不是某些私有实现类吗?我应该写自己的删除器吗?

3 个答案:

答案 0 :(得分:2)

为什么不

class unOnly
{
    unOnly() {}
    ~unOnly() {}
    struct deleter { void operator()(unOnly* x) { delete x; }};

public:
    typedef std::unique_ptr<unOnly, deleter> handle;

    static handle create() { return handle(new unOnly); }
};

auto x = unOnly::create();

?甚至

class unOnly
{
    ~unOnly() {}
    struct deleter { void operator()(unOnly* x) { delete x; }};

public:
    unOnly() {}
    typedef std::unique_ptr<unOnly, deleter> handle;
};

unOnly::handle x(new unOnly);

(我更喜欢前者,但后者可能更符合你所要求的精神)

答案 1 :(得分:1)

unique_ptr(除了拥有一个拥有它指针的对象)之外的一点是,你可以传递一个自定义删除器,所以只写一个而不是做其他事情是有意义的,这似乎不必要的复杂。

答案 2 :(得分:1)

引用标准:

  

20.7.1 类模板unique_ptr

     

6 。 [...]

  template<class T, class D = default_delete<T>> class unique_ptr;
     

<强> 20.7.1.1.1

     

1 类模板default_delete用作类模板unique_ptr的默认删除器(销毁策略)。

因此,似乎需要unique_ptr的实现才能使用default_delete作为默认删除器。

修改
但这并不意味着你的方法是万无一失的,请参阅@RMartinhoFernandes的评论。