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 是第二个指针,Pointer_To_Testclass 是第一个指针)

更新/解释

我希望能够删除 pArray[0][0] 而 pArray[0][1] 仍然存在,如果 [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:
    // ...
};

但是,鉴于您正在存储指针,您可能需要考虑使用 Boostptr_vector而不是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

如果您已经动态创建了一个数组,则使用 delete[] 将其删除。你必须给 delete[] 一个指向数组开头的指针,但是,不是数组的元素!

如果您希望元素可删除,则必须单独动态分配它们。

所以你必须有一个多维的指针数组;

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

然后动态分配每一个,这痛苦。

然而,有趣的是,您甚至试图这样做,为什么要删除单个元素?

于 2012-08-17T17:01:12.120 回答
0

取决于你的分配pArray[i][j]。如果是这样的话,pArray[i][j] = new int;那就打电话delete Pointer_To_TestClass->pArray[0][0];。如果是这样pArray[i][j] = new int[10],请使用您的第二个选项,delete[] Pointer_To_TestClass->pArray[0][0];. 我还强烈建议在删除后立即将其设置为 NULL 并继续检查 NULL。

第三个没有为我编译delete[][] Pointer_To_TestClass->pArray[0][0]; 我得到了错误

第 34 行:错误:由于 -Wfatal-errors 导致 '[' 令牌编译终止之前的预期主表达式。

另外,我强烈建议在析构函数中进行这些删除。其他地方可能也很好。

您可能会发现 int* 的 typedef 有助于理解您有一个 int* 的二维数组的可读性。

于 2012-08-17T17:32:35.293 回答