1

によって管理されるクラスを作成しています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

標準からの引用:

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 に答える
1

(ポインタを所有するオブジェクトを持つことに加えて)のポイントはunique_ptr、カスタムデリータを渡すことができるため、不必要に複雑に見える他のことをする代わりに、それを書くだけで理にかなっています。

于 2012-07-12T16:09:16.827 に答える