【发布时间】:2020-09-23 22:00:19
【问题描述】:
我正在尝试设置一个二维指针数组,但是我在实际分配内存时遇到了问题。每当我尝试将值写入数组时,都会出现访问写入位置错误。
网格.h
class Grid
{
public:
Grid();
private:
int x;
int y;
int row;
int col;
Grid*** array2D;
};
Grid.cpp
Grid::Grid()
{
row = 32;
col = 30;
// Allocate memory to point to.
array2D = new Grid**[row];
for (int i = 0; i < row; i++) {
array2D[i] = new Grid*[col];
}
for (int i = 0; i <= row; i++)
{
for (int j = 0; j <= col; j++)
{
array2D[i][j]->x=6;
array2D[i][j]->y =5;
}
}
Unhandled exception at 0x000C1CC8 in Project.exe: 0xC0000005: Access violation writing location 0xCDCDCE29.
Exception thrown at 0x000C1CC8 in Project.exe: 0xC0000005: Access violation writing location 0xCDCDCE29.
【问题讨论】:
-
为什么需要一个指向
Grid对象的指针 数组?您的Grid对象是否存储在内存中的其他位置?如果不是,为什么不使用 actualGrid对象数组来代替?您可以很好地分配数组本身(尽管使用std::vector比使用new[]更好),但是您没有将Grid*元素分配为实际指向任何地方,这就是代码崩溃的原因。此外,您的第二组循环超出了数组维度的范围,请使用<而不是<=。 -
看起来你已经创建了行和列,但不是
Grids。您需要在第一个循环中迭代列并生成它们。不过还有另一个问题,Grid包含一个自身的数组。我不完全明白这个概念,但它看起来像一个无限递归。 -
@NO_NAME 关于潜在的无限递归的好点,我错过了。
-
顺便说一句,我真的不鼓励在如此低的水平上管理内存,除非这个程序是为了专门学习这一点。您应该使用一些更高级别的构造,例如
std::unique_ptr和std::vector,这会使您更难犯错误并记住以释放内存。你的数组的等价物类似于std::vector<std::vector<std::unique_ptr<Grid>>>(取决于你真正想做的事情)。这可能看起来很吓人,但实际上很容易使用。 -
如果只需要一个固定大小的数组,就不需要动态分配内存。这不是 Java。您只需写
Grid array2D[32][30];并收工。
标签: c++ arrays pointers multidimensional-array datagrid