delete
ベクトルをクリアする前、またはベクトルが を指すオブジェクトを所有している場合、ベクトルが範囲外になる前に、要素を呼び出す必要があります。より洗練された解決策は、ベクトルにスマート ポインターを保持させることです。スマート ポインターの特定の種類は、所有権ポリシーに依存する必要があります。たとえば、指定されたオブジェクトを所有するベクトルは C++11 を使用する必要がありますstd::unique_ptr
。
std::vector<std::unique_ptr<Obstacle>> obstacles;
もちろん、上記のすべては、実際にポインタを使用する強い理由があることを前提としています。多くの場合、最良の解決策は最も単純なものです: アイテムを値で保持します:
std::vector<SomeType> things;
これは、基本クラスから派生したオブジェクトへのポインターを格納している場合には適用されないことに注意してください。これは、基本型の値を格納するとオブジェクト スライスが発生するためです。
編集: ベクトルがスコープ外になったときに要素が確実に削除されるようにする簡単な方法の 1 つは、スコープ ガード クラスを作成することです。
template <typename CONTAINER>
struct PtrContainerGuard
{
PtrContainerGuard(CONTAINER& container) : c_(container) {}
~PtrContainerGuard()
{
for (typename CONTAINER::iterator it = c_.begin(); it != c_.end(); ++it)
delete (*it);
}
private:
CONTAINER& c_;
}
それから
std::vector<Obstacle*> obstacles;
PtrContainerGuard<std::vector::Obstacle*> p(obstacles);