1

C++ で valgrind メモリ リークが発生しました。Main 関数でクラス Coordinate の 2 次元ベクトル ポインターを作成し、いくつかのランダムな値で埋めました。

vector< vector<Coordinate*> > parent_vector_coords;
parent_vector_coords.push_back(calculateCannonCoordinates(bow_x, bow_y,
    stern_x, stern_y, game, 2);

ここで、ポインターを削除する必要があります。1つのアプローチはこれでした:

for(unsigned int i = 0; i < parent_vector_coords.size(); i++)
{
  for(unsigned int index = 0; index < parent_vector_coords[i].size(); index++)
  {
    delete parent_vector_coords[i][index];
  }
}

編集calculateCannonCoordinates:

vector<Coordinate*> calculateCannonCoordinates(int bow_x, int bow_y, 
    int stern_x, int stern_y, Game& game, int value)
  {
    vector<Coordinate*> coords;

    if(bow_x == stern_x)
    {
      if(bow_y < stern_y)
      {
        for(int index = bow_y; index <= stern_y; index++)
        {
          coords.push_back(new Coordinate(index, bow_x));
          game.getBoard()->getField()[index][bow_x].setValue(value);
        }
      }
      else if(bow_y > stern_y)
      {
        for(int index = bow_y; index >= stern_y; index--)
        {
          coords.push_back(new Coordinate(index, bow_x));
          game.getBoard()->getField()[index][bow_x].setValue(value);
        }
      }
    }
    else if(bow_y == stern_y)
    {
      if(bow_x < stern_x)
      {
        for(int index = bow_x; index <= stern_x; index++)
        {
          coords.push_back(new Coordinate(bow_y, index));
          game.getBoard()->getField()[bow_y][index].setValue(value);
        }
      }
      else if(bow_x > stern_x)
      {
        for(int index = bow_x; index >= stern_x; index--)
        {
          coords.push_back(new Coordinate(bow_y, index));
          game.getBoard()->getField()[bow_y][index].setValue(value);
        }
      }
    }

    return coords;
  }

しかし、ベクトルが原因でメモリリークが発生します。誰かがポインターを削除する正しい方法を知っていますか?

4

1 に答える 1

1

まだこの質問を見ている方がいらっしゃるので、お答えすることにしました。

Coordinate に別の Pointer Object があり、自動的にインスタンス化されたように見えました (そのときは忘れていました)。Coordinate を解放する前にその Pointer を削除しませんでした。それが Valgrind メモリ リーク エラーの原因です。

同様の問題を抱えているすべての人は、コメント セクション (スマート ポインターなど) に記載されているアドバイスを考慮する必要があります。

于 2014-08-08T18:14:26.383 に答える