質問

私はC ++でのバイナリツリーを実装するプロセスにいますよ。伝統的に、私は左へのポインタと右へのポインタを持っていると思いますが、マニュアルのメモリ管理は、通常、涙で終わります。これは私の質問に私をリードして...

データ構造は、shared_ptrのを使用するための適切な場所はありますか?

役に立ちましたか?

解決

私はそれはあなたがそれらを使用することだろう場所に依存すると思います。私は何をやって考えていることは、このようなものであることを仮定しています:

template <class T>
class BinaryTreeNode 
{
    //public interface ignored for this example
    private:
        shared_ptr<BinaryTreeNode<T> > left;
        shared_ptr<BinaryTreeNode<T> > right;
        T data;
}

これは完璧な理にかなっての場合は、動的に作成されたノードを処理するために、あなたのデータ構造を期待しています。それは通常の設計ではありませんので、しかし、私はそれが不適切だと思います。

しかし、バイナリツリー内のノードは、のないの今までにある -

私の答えはのshared_ptrの使用は、オブジェクトが実際に共有されていることを暗示するように、いや、それは、shared_ptrのを使用するための適切な場所ではないということだろう共有。しかし、マーティンとニューヨークはなぜ車輪の再発明、指摘 - のauto_ptrを - 私たちは何をしようとしてんスマートポインタ型がすでにあります。したがって、このような何かで行くます:

template <class T>
class BinaryTreeNode 
{
    //public interface ignored for this example
    private:
        auto_ptr<BinaryTreeNode<T> > left;
        auto_ptr<BinaryTreeNode<T> > right;
        T data;
}
データはshared_ptrのない理由を誰もが要求された場合は、

、答えは簡単です - データのコピーは、のクライアントのライブラリーのための優れている場合、彼らはデータ項目に渡し、木ノードは、コピーを作成します。 のクライアントのは、コピーは悪い考えであると判断した場合には、のクライアントのコードは、ツリーノードが安全にコピーすることができ、shared_ptrのを渡すことができます。

他のヒント

左右のブーストを共有されませんので:: shared_ptrの<>おそらく正しいスマートポインタではありません。

これは、STDを試すには良い場所でしょう:: auto_ptrは<>

はい、絶対ます。

しかし、あなたは、円形のデータ構造を持っている場合は注意してください。あなたがお互いに共有PTRを持つ2つのオブジェクトの両方を持っている場合は、それらを手動で共有PTRをクリアせずに解放されることはありません。弱いPTRは、この場合に使用することができます。これは、もちろん、バイナリツリーと心配ではありません。

手動メモリ管理を書き込むと、各オブジェクトは、したがって、それはそのデストラクタで所有しているものを削除することができ、単一の所有者を、持っているそれらの幸せな機会にそれほど難しいものではありません。

定義によると、ツリーは、それぞれが単一の親、したがって、その単一の所有者のための明白な候補者を持つノードで構成されていることを考えると、これはまさにそのような幸せな機会です。おめでとうございます!

私はそれが*あなたのケースでは、このようなソリューションを開発し、また全く同じインターフェイスの背後にある違いを隠し、shared_ptrのアプローチを試みる価値は十分だと思うので、次の2つの間で切り替えると、いくつかの現実的でパフォーマンスの違いを比較します実験。それはshared_ptrがアプリケーションに適しているかどうかを知る唯一の確実な方法です。

(*私たちのために、あなたはそれがどのようになる教えている場合。)

データ構造のノードについてのshared_ptrを使用しないでください。これは、ノードの破壊は、所有権が共有された任意の点であれば中断または遅延させることができます。これは、デストラクタが間違った順序で呼び出されることがあります。 これは、他のノードとデストラクタとの結合は、他のノードからのコードその脱結合を含有する任意のコードを格納するノードのコンストラクタのためのデータ構造にお勧めします。誤った順序で呼び出されるデストラクタは、この設計を破ることができます。

がありshared_ptrのと余分なオーバーヘッドのビットは、特にスペース要件では、ですが、あなたの要素を個別に割り当てられている場合は、その後のshared_ptrは完璧だろう。

あなたもポインタが必要ですか?あなたがboost::optional<BinaryTreeNode<T> > left, rightを使用することができそうです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top