私は次のようなクラスを持っています:
class node
{
public:
node* parent;
std::list<node*> children;
};
生のポインターの代わりにスマートポインターを使用する必要がありますか?なんで?はいの場合、どのようなスマートポインタですか?
私は次のようなクラスを持っています:
class node
{
public:
node* parent;
std::list<node*> children;
};
生のポインターの代わりにスマートポインターを使用する必要がありますか?なんで?はいの場合、どのようなスマートポインタですか?
リソース (メモリ、ファイルなど) を所有している場合は、常にスマート ポインターを使用してください。それらを手動で所有すると、非常にエラーが発生しやすくなり、DRYなどの多くの優れたプラクティスに違反します。
どちらを使用するかは、必要な所有権のセマンティクスによって異なります。単一の所有権と共有所有unique_ptr
権に最適です。shared_ptr
子は親を所有していないため、生の親ポインタは問題ありません。ただし、親が子供を所有している場合は、unique_ptr
ここで最適に機能します。
また、ポインターのリンクされたリストとは一体何なのかということも注目に値します。それは意味がありません。値のリンクされたリストではないのはなぜですか?
常にスマート ポインターを使用することをお勧めしますが、参照のループに注意してください。
class node
{
public:
std::weak_ptr<node> parent;
std::list< std::shared_ptr<node> > children;
};
それがそもそもがある理由weak_ptr
です。それらはループを検出するほどスマートではないことに注意してください。手動で検出し、weak_ptr
s を使用してそれらを中断する必要があります。
絶対違う。通常のスマート ポインターは、グラフのような構造では機能しないため、避ける必要があります。この場合、ツリーがあり、ツリー オブジェクト自体からのすべての削除 (および割り当て) を問題なく処理できます。