1

我正在创建一个由 a 管理的类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对象,而不是某些私有实现类?我应该写自己的删除器来确定吗?

4

3 回答 3

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);

(我更喜欢前者,但后者可能更符合您的要求)

于 2012-07-12T16:35:52.443 回答
1

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

于 2012-07-12T16:09:16.827 回答
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 评论。

于 2012-07-12T16:15:10.537 回答