通过另一个指针删除指向类中多维数组的指针 - 如何?

时间:2012-08-17 16:45:18

标签: c++ class pointers multidimensional-array delete-operator

我有一个指向类的指针,它有一个指向多维数组的指针,但是当我需要或者将它设置为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是第一个指针)

UPDATE /解释

我希望能够删除pArray [0] [0],而pArray [0] [1]仍然存在,如果[0] [0]不存在,它应该等于 NULL 。大多数是因为我想通过[X] [Y]值访问此数组以便于访问。如果[0] [0]是一个指针,删除时它应为NULL,这样我就可以检查它是否为NULL。

任何人都有任何想法?

4 个答案:

答案 0 :(得分:6)

如果你想要一个指向<whatever>的2D数组,请创建一个类来处理它,然后将它的一个实例放在你的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:
    // ...
};

但是,鉴于您要存储指针,您可能需要考虑使用Boost ptr_vector而不是std::vector

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

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

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

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

然后动态分配每个,其中是一种痛苦。

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

答案 3 :(得分: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行:错误:在'['标记之前预期的primary-expression   由于-Wfatal-errors而导致编译终止。

另外,我强烈建议在析构函数中删除这些内容。其他地方也可以

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