簡體   English   中英

調用新運算符(C ++)時程序崩潰

[英]Program crashes when calling new operator (C++)

我正在研究一些教程,這些教程涉及在C中創建ASCII游戲引擎並在C ++中編寫程序進行練習。 我目前正在處理一些東西,以圖像結構的形式在堆上分配圖像數據(包含int寬度,int高度和兩個char指針,這些指針指向堆中保存chars [width * height]數組的位置大小)...但是,在調用新運算符時遇到一些問題。 我為結構本身及其字符和顏色數據分配內存的函數如下所示:

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);

如果有人認為有必要,我可以發布更多代碼,但該程序僅在這一點上-實際上,是在此之前,因為它在調用new運算符的函數中第二次調用allocateImage時崩潰了。 到目前為止,該程序一直運行良好-僅有的最近增加的功能是用於在堆上分配圖像數據(用於創建大小可變的圖像)以及釋放(該程序無法實現)的功能。 。 由於我正在學習的程序是用C編寫的,因此在這里查看源代碼對我無濟於事,而Google的幫助也不多。 誰能指出我出了什么問題?

這些線

*(&image->chars + i) = 0;
*(&image->colours + i) = 0;

令人懷疑,因為image已經是一個指針。 指向指針的指針在這里沒有意義。 只需刪除&

由於您的實際代碼會寫入Joe Random Address,所以任何事情都可能發生。 因此,阻止內存子系統並阻止下一個new調用並不罕見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM