2

要素が他のクラスへの生のポインタであるSTLベクトルがあるとしましょう。ベクターのデストラクタがこれらのポインタが所有するメモリを解放しないことは明らかです。このメモリを解放するカスタムデストラクタを実装することは可能ですか?

4

3 に答える 3

6

最新のC++では、を使用するvector<unique_ptr<T>>と、すべての所有権の問題が管理されます。

C ++ 11が使用できない場合は、shared_ptrではなく(BoostまたはTR1から)を使用するか、 Boostのポインターコンテナーunique_ptrを使用できます。(非推奨を使用しようとしないでください。誤ってコンテナーからポインターを削除するのが非常に簡単になるためです。おそらく、最初のコメントはこれを参照していますが、はるかに安全なものと混同しています。)auto_ptrunique_ptr

何らかの理由でこれらを使用できない場合、または本当に自分で作業を行いたい場合は、次のクラスでベクトルをラップする必要があります。

  • 保存されている各ポインタを削除するデストラクタ。
  • コピーコンストラクターとコピー代入演算子。削除されるか、「ディープ」コピーを実行します。そうしないと、2つのベクトルが同じオブジェクトを所有していると考える危険があります。
  • オブジェクトを削除せずに格納されたポインタを上書きできないように要素を読み取って変更するためのアクセサ。
于 2013-03-25T12:31:38.793 に答える
3

いいえ。ベクトルを破棄する前に、要素を手動でクリアする必要があります。何かのようなもの

std::for_each(v.begin(), v.end(), [](const T* p) { delete p; });

boost::ptr_vectorまたは、このケースを処理する(またはいくつかのsmart_pointers)のようなものを使用できます。

于 2013-03-25T12:24:25.067 に答える
0

削除時にベクトルを反復処理し、その中の各要素のデストラクタを呼び出す必要があります

shared_ptr<A>または、A *を保存する代わりに、保存して、だれもAを指さなくなったときに、それが破棄されるのが最善のオプションだと思います。

于 2013-03-25T12:23:18.603 に答える