0

私は C++ が初めてで、メモリ管理について質問があります。

ヘッダーには、これがあります:

std::vector<Obstacle::Obstacle*> obstacles;

そして.cppで私はこれを行います:

Circle *circle = new Circle(x, y, radius);
obstacles.push_back(circle);

CircleのサブクラスですObstacle

私の質問はdelete、ベクター内にある要素をいつ呼び出す必要があるかということです。newそれぞれが によってバランスが取れているべきだと聞いたことがありdeleteます。デストラクタでベクターをループしてdelete各要素を呼び出す必要がありますか? もっとエレガントな方法はありませんか?

ありがとう

4

3 に答える 3

10

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);
于 2012-10-14T09:15:36.940 に答える
0

なぜshared_ptrを使わないのですか? 新しいオブジェクトを作成する必要はなく、それらを使用する場合にそれらを削除することを心配する必要はありません。

typedef shared_ptr<Obstacle> ObstaclePtr;
int main()
{
std::vector<ObstaclePtr> obstacles;
//Create objets using shared_ptr and push them in vector
ObstaclePtr obstacle1(new Circle());
obstacles.push_back(obstacle1);

ObstaclePtr obstacle2(new Circle());
obstacles.push_back(obstacle2);
//When vector obstacles goes out of scope here, all circles inside are destructed!
 }
于 2012-10-14T11:05:40.557 に答える
-1

はい、もっとエレガントな方法があります。すべてのポインタを捨てます。

std::vector<Obstacle::Obstacle> obstacles;

Circle circle(x, y, radius);
obstacls.push_back(circle);

何も行われnewず、何も行う必要がなくdelete、メモリ割り当てを節約し、ベクトルに格納されたオブジェクトへのアクセスがより効率的になります。

また、経験豊富な C++ 開発者がコードに目を奪われることもありません。

全体として、私はそれを勝利と呼んでいます。:)

于 2012-10-14T09:17:00.317 に答える