std::vector<Object *> pVector;
範囲外の場合、ポインターの配列/ベクトルはすべてのポインター要素を自動的に削除できますか? またはすべてのオブジェクトを手動で削除する必要がありますか?
だから私はそれを考えることができますか:ベクトル/配列がポインターのない要素を格納する場合、それは自動的にデコンストラクターを呼び出しますか? しかし、ポインターが格納されている場合は、要素を手動で削除する必要がありますか?
vector
ベクトルに格納されているオブジェクトを適切に破棄します。デストラクタが呼び出されます。ポインターのベクトルがある場合、これはポインター自体のデストラクタを意味します (ポインターが指すものではありません)。
生ポインタのデストラクタは何もしません。これは、プログラムの別の部分が破棄するオブジェクトへの非所有ポインターがある場合に必要です。
スマート ポインターのデストラクタは、オブジェクトが適切なタイミングで解放されるようにするために必要なことは何でも行います。さんにとってunique_ptr
は、まさに今です。の場合shared_ptr
、参照カウントがゼロになったときです。
正しい種類のポインターとトラストベクターを使用して、要素が消去されたときにそのポインターに関連付けられた動作をトリガーします。
いいえ、vector
それが保持するメモリのみを削除します。これは、ポインタを保持するためのメモリです。事実上、次のようなサイズの配列になります。
Object **array = new Object*[size];
デストラクタが呼び出されると、削除されるのは次の配列ストアだけです。
delete[] array;
ご覧のとおり、これらのポインターが指しているものが何であれ、これは解放されません。これが、未加工のポインタではなくvector
ofunique_ptr
またはasを使用する必要がある理由です。shared_ptr
std::vector が破棄されると、メモリへのポインタだけが 破棄されるのでObject *
はなく、デストラクタが呼び出されます。Object
メモリを管理するスマート ポインターを使用する必要があり(std::shared_ptr<Object> or std::unique_ptr<Object>)
ます。boost::ptr_vector<Object>