我正在学习一些关于用 C 创建 ASCII 游戏引擎并用 C++ 编写程序进行练习的教程。我目前正在研究一些内容,以 Image 结构的形式在堆上分配图像数据(包含 int width、int height 和两个指向堆上保存字符数组 [width * height] 的位置的 char 指针)大小)...但是,我在调用新运算符(operator)时遇到一些问题。我为结构本身及其字符和颜色数据分配内存的函数如下所示:
Image *allocateImage(int width, int height) {
Image *image;
image = new Image;
if (image == NULL)
return NULL;
image->width = width;
image->height = height;
image->chars = new CHAR[width * height];
image->colours = new COL[width * height];
//image->colours = (CHAR*) PtrAdd(image->chars, sizeof(CHAR) + width * height);
for (int i = 0; i < width * height; ++i) { //initializes transparent image
*(&image->chars + i) = 0;
*(&image->colours + i) = 0;
}
return image;
}
主函数本身(该函数被调用两次)如下所示:
int main() {
int x, y, offsetx, offsety;
DWORD i;
srand(time(0));
bool write = FALSE;
INPUT_RECORD *eventBuffer;
COLORREF palette[16] =
{
0x00000000, 0x00800000, 0x00008000, 0x00808000,
0x00000080, 0x00800080, 0x00008080, 0x00c0c0c0,
0x00808080, 0x00ff0000, 0x0000ff00, 0x00ffff00,
0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff
};
COORD bufferSize = {WIDTH, HEIGHT};
DWORD num_events_read = 0;
SMALL_RECT windowSize = {0, 0, WIDTH - 1, HEIGHT - 1};
COORD characterBufferSize = {WIDTH, HEIGHT};
COORD characterPosition = {0, 0};
SMALL_RECT consoleWriteArea = {0, 0, WIDTH - 1, HEIGHT - 1};
wHnd = GetStdHandle(STD_OUTPUT_HANDLE);
rHnd = GetStdHandle(STD_INPUT_HANDLE);
SetConsoleTitle("Title!");
SetConsolePalette(palette, 8, 8, L"Sunkure Font");
SetConsoleScreenBufferSize(wHnd, bufferSize);
SetConsoleWindowInfo(wHnd, TRUE, &windowSize);
for (y = 0; y < HEIGHT; ++y) {
for (x = 0; x < WIDTH; ++x) {
consoleBuffer[x + WIDTH * y].Char.AsciiChar = (unsigned char)219;
consoleBuffer[x + WIDTH * y].Attributes = FOREGROUND_BLUE;
}
}
write = TRUE;
Image *sun_image = allocateImage(SUNW, SUNH);
Image *cloud_image = allocateImage(CLOUDW, CLOUDH);
setImage(sun_image, SUN.chars, SUN.colors);
setImage(cloud_image, Cloud.chars, Cloud.colours);
如果有人觉得有必要,我可以发布更多代码,但程序只达到了这一点 - 事实上,稍早一点,因为它在第二次调用 allocateImage 时崩溃,在函数中 new 运算符所在的位置叫。到目前为止,该程序一直运行良好 - 最近唯一添加的功能是在堆上分配图像数据(用于创建可变大小的图像)以及释放(该程序无法实现) 。由于我正在学习的程序是用 C 语言编写的,因此查看源代码对我没有帮助,而且 Google 也没有提供太多帮助。谁能指出我出了什么问题吗?
最佳答案
这些行
*(&image->chars + i) = 0;
*(&image->colours + i) = 0;
是可疑的,因为 image
已经是一个指针。指向指针的指针在这里没有意义。只需删除 &
。
由于您的实际代码写入 Joe 随机地址,所以任何事情都可能发生。因此,您阻碍内存子系统并因此阻碍下一个 new
调用的情况并不罕见。
关于c++ - 调用 new 运算符时程序崩溃 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17510448/