4

データを保持する単純な C++ クラスがいくつかあります。それらは階層的で、それぞれに子へのポインターのリストが含まれています (メモリにたくさんあるので、それらをコピーしたくありませんでした)。

私は最高レベルのみを処理し(関数に渡します)、各レベルのデストラクタでその子を破棄したいので、すべてを解放する必要があるのは、一番上の親で削除を呼び出すことだけです。これにより、一部のクラスがスタック上に作成されたときに問題が発生しますが、これは実際には問題の症状にすぎません。

私が見ているように、同じレベルでオブジェクトを作成および破棄する必要があるため、delete を呼び出す必要があるかどうかを知る必要があります。ただし、これにより、すべての子へのポインターを保持し、コードで使用するたびにそれらを破棄する必要があり、最上位の親で削除を呼び出すよりも汚い解決策になります。

したがって、私のオプションは次のとおりです。

  1. スタック上で定義しない (BAD)
  2. このオブジェクトを削除するかどうかを示すブール値をコンストラクターに渡します (BAD)
  3. 作成方法に応じて、使用するたびにオブジェクトを手動で削除します (BAD)
  4. アイテムを「ローカルに」コピーします(何千ものアイテムがある可能性があるため、悪いことです)
  5. スマートポインター?何かの枠組み?(使えるものはかなり限られます)

何か不足していますか?他のアイデアはありますか?

ありがとう、ヴァディム。

4

2 に答える 2

0

C++11 では、move コンストラクターを定義し、オブジェクトがスコープ外になる前に呼び出すstd::moveことで、そうでなければdeleted を取得するリソースの所有権を渡すことができます。

C++03 では、同じ機能を言語形式なしで定義できますが、オブジェクトが空である状態を追加する必要があります。これは、多くの場合、デフォルトのコンストラクターを導入して を実装することによって行われますswap

削除されるポインターは、デフォルトで null に構築される必要があり、スワップ (またはコピー コンストラクター、または任意の関数) がスコープを超えて存在する新しいコンテナー オブジェクトにポインターを渡すと、それらは に設定されNULLますdelete。効果 (そして、オブジェクトを使用不可にします。これは「ダーティ」ですが、オブジェクトが移動された後、オブジェクトが何にも使用されていないことを簡単に確認できるほど悪くはありません)。

于 2013-01-14T10:15:28.607 に答える
0

子オブジェクトを に保持することを検討してくださいstd::list。を使用する代わりに、 を使用しnewて新しい子を作成し、push_back()それへのポインタを返す関数を記述します。子を直接破棄する必要はなく、リークを防ぐことができます。

于 2014-10-17T23:49:13.730 に答える