我有一个指向类的指针,它有一个指向多维数组的指针,但是当我需要或者将它设置为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。
任何人都有任何想法?
答案 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 *的二维数组的可读性。