调用new运算符时程序崩溃(C++)

Com*_*der 2 c++ new-operator

我正在研究一些在C中创建ASCII游戏引擎并用C++编写程序来练习的教程.我目前正在研究一些东西,它们以Image结构的形式在堆上分配图像数据(包含int宽度,int高度,以及两个char指针指向堆上的位置,这些位置包含chars [width*height]的数组size)...但是,我在调用new运算符时遇到了一些问题.我为结构本身分配内存的函数,以及它的字符和颜色数据,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

main函数本身(此函数被调用两次)如下所示:

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);
Run Code Online (Sandbox Code Playgroud)

如果有人认为有必要,我可以发布更多代码,但程序只达到这一点 - 事实上,之前,在第二次调用allocateImage时崩溃,在调用new运算符的函数中.该程序一直工作到这一点 - 最近唯一的添加功能是在堆上分配图像数据的功能(用于创建具有可变大小的图像)以及解除分配(该程序无法达到) .由于我正在学习的程序是用C语言编写的,因此查看源代码对我来说无济于事,Google也没有太大帮助.谁能指出我出了什么问题?

A.H*_*.H. 5

这些线

*(&image->chars + i) = 0;
*(&image->colours + i) = 0;
Run Code Online (Sandbox Code Playgroud)

是可疑的,因为image已经是一个指针.指向指针的指针在这里没有意义.只需删除&.

由于您的实际代码写入Joe随机地址,任何事情都可能发生.因此,你挫败内存子系统并因此阻止下一次new调用并不罕见.