1

多次元配列へのポインタを持つクラスへのポインタがありますが、必要なときにメモリから削除したり、NULLに設定したりできないようです。

#define X 10
#define Y 10

struct TestClass
{
public:
       int      *pArray[X][Y];
};


// different tries, none working:

delete Pointer_To_TestClass->pArray[0][0];
delete[] Pointer_To_TestClass->pArray[0][0]

// or by simply:

Pointer_To_TestClass->pArray[0][0] = NULL;

画面に結果が表示されるので、配列にデータがあることがわかります。また、すでにNULLであるかどうかを確認してから、削除しようとしないでください。

別のポインターのポインターを削除したいので、これは別の方法で機能する特別な状況ですか?同様に、ポインター内のポインターではなく、他のポインターを保持している最初のポインターを削除します(pArrayは2番目のポインター、Pointer_To_Testclassは最初のポインターです)

更新/説明

pArray[0][1]がまだ存在している間にpArray[0][0]を削除できるようにしたいのですが、[0] [0]が存在しない場合は、NULLに等しくする必要があります。ほとんどの場合、簡単にアクセスできるように[X][Y]値でこの配列にアクセスしたいからです。[0] [0]がポインタの場合、NULLかどうかを確認できるように、削除時にNULLにする必要があります。

誰かアイデアはありますか?

4

4 に答える 4

6

へのポインターの 2D 配列が必要な場合は<whatever>、それを処理するクラスを作成し、そのインスタンスを TestClass に配置します。それを行う方法に関しては、通常、次の順序で何かを使用します。

template <class T>
class matrix2d {
    std::vector<T> data;
    size_t cols;
    size_t rows;
public:
    matrix2d(size_t y, size_t x) : cols(x), rows(y), data(x*y) {}
    T &operator()(size_t y, size_t x) { 
        assert(x<=cols);
        assert(y<=rows);
        return data[y*cols+x];
    }
    T operator()(size_t y, size_t x) const { 
        assert(x<=cols);
        assert(y<=rows);
        return data[y*cols+x];
    }
};

class TestClass { 
    matrix2d<int *> array(10, 10);
public:
    // ...
};

ただし、ポインターを格納していることを考えると、ptr_vectorの代わりにBoost の使用を検討することをお勧めしますstd::vector

于 2012-08-17T16:59:21.360 に答える
2
#define X 10
#define Y 10

struct TestClass
{
public:
  TestClass()
  {
    // Must initialize pArray to point to real int's otherwise pArray
    // will have bogus pointers.
    for (size_t y = 0; y < Y; ++y)
      {
    for (size_t x = 0; x < X; ++x)
      {
        pArray[x][y] = new int;
      }
      }
  }

  int      *pArray[X][Y];
};

int main()
{
  TestClass *Pointer_To_TestClass = new TestClass;
  delete Pointer_To_TestClass->pArray[0][0];
  Pointer_To_TestClass->pArray[0][0] = 0;
  return 0;
}
于 2012-08-17T17:54:47.753 に答える
0

の割り当てによって異なりますpArray[i][j]。それが次のようなものである場合pArray[i][j] = new int;は、を呼び出しますdelete Pointer_To_TestClass->pArray[0][0];。次のようなpArray[i][j] = new int[10]場合は、2番目のオプションを使用しますdelete[] Pointer_To_TestClass->pArray[0][0];。また、削除の直後にNULLに設定し、NULLのチェックを続行することを強くお勧めします。

3番目のものは私のためにコンパイルされませんでした私delete[][] Pointer_To_TestClass->pArray[0][0]; はエラーが発生しました

34行目:エラー:-Wfatal-errorsが原因で、'['トークンのコンパイルが終了する前にプライマリ式が必要です。

また、これらの削除をデストラクタに含めることを強くお勧めします。他の場所でも問題ないかもしれません。

int *のtypedefは、int*の2次元配列があることを読みやすく理解するのに役立つ場合があります。

于 2012-08-17T17:32:35.293 に答える
0

配列を動的に作成した場合は、delete[] で削除します。ただし、配列の要素ではなく、配列の先頭へのポインターを delete[] に指定する必要があります。

要素を削除可能にしたい場合は、動的に個別に割り当てる必要があります。

したがって、ポインターの多次元配列が必要です。

int *(*pArray)[X][Y];

次に、それぞれを動的に割り当てますが、これは面倒です。

ただし、これを試みているのは興味深いことですが、なぜ単一の要素を削除したいのでしょうか?

于 2012-08-17T17:01:12.120 に答える