通过另一个指针删除指向类多维数组 - 怎么样?(Delete pointer to multidim

2019-06-27 03:47发布

我有一个指针指向一个类,有一个指向多维数组,但我似乎无法从内存中删除它时,我需要或将其设置为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,则不会尝试将其删除。

因为我想在另一个指针来删除一个指针 - 这是一个特殊情况,工程不同? 像它删除第一指针保持另一个指针,而不是指针内的指针(粒子阵列是第二指针,Pointer_To_Testclass是第一指针)

UPDATE /解释

我希望能够删除粒子阵列[0] [0],而粒子阵列[0] [1]仍然存在,如果[0] [0]不存在应等于NULL。 大多数是因为我想访问该阵列由[X] [Y]为方便值。 如果[0] [0]是一个指针,它应当被删除,所以我可以检查它是否是NULL为NULL。

任何人有任何想法?

Answer 1:

如果你想指针的二维数组<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:
    // ...
};

假设你存储指针,不过,你可能要考虑使用Boost ptr_vector代替std::vector



Answer 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;
}


Answer 3:

取决于你的分配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,并与检查空继续它的删除。

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

线34:错误:前由于-Wfatal-错误终止“[”令牌汇编预期基本表达式。

另外,我会强烈建议其在析构函数的删除。 其他地方可能被罚款以及。

您可能会发现INT *的typedef的成为可读性了解你有一个整型的二维数组*很有帮助。



Answer 4:

如果你动态创建一个数组,然后将其删除与删除[]。 你必须给删除[]的指针数组的开始,但是,没有一个数组的元素!

如果您希望元素可删除,那么他们必须单独进行动态分配。

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

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

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

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



文章来源: Delete pointer to multidimensional array in class through another pointer - how?