7

私は次のようなクラスを持っています:

class node
{
public:

     node* parent;
     std::list<node*> children;
};

生のポインターの代わりにスマートポインターを使用する必要がありますか?なんで?はいの場合、どのようなスマートポインタですか?

4

3 に答える 3

16

リソース (メモリ、ファイルなど) を所有している場合は、常にスマート ポインターを使用してください。それらを手動で所有すると、非常にエラーが発生しやすくなり、DRYなどの多くの優れたプラクティスに違反します。

どちらを使用するかは、必要な所有権のセマンティクスによって異なります。単一の所有権と共有所有unique_ptr権に最適です。shared_ptr

子は親を所有していないため、生の親ポインタは問題ありません。ただし、親が子供を所有している場合は、unique_ptrここで最適に機能します。

また、ポインターのリンクされたリストとは一体何なのかということも注目に値します。それは意味がありません。値のリンクされたリストではないのはなぜですか?

于 2012-07-02T09:46:23.897 に答える
5

常にスマート ポインターを使用することをお勧めしますが、参照のループに注意してください。

class node
{
public:
     std::weak_ptr<node> parent;
     std::list< std::shared_ptr<node> > children;
};

それがそもそもがある理由weak_ptrです。それらはループを検出するほどスマートではないことに注意してください。手動で検出し、weak_ptrs を使用してそれらを中断する必要があります。

于 2012-07-02T09:44:55.113 に答える
-2

絶対違う。通常のスマート ポインターは、グラフのような構造では機能しないため、避ける必要があります。この場合、ツリーがあり、ツリー オブジェクト自体からのすべての削除 (および割り当て) を問題なく処理できます。

于 2012-07-02T09:50:07.983 に答える