Идентификатор не определен при удалении динамического массива

Я пробую код для захвата информации о растровом изображении с помощью CreateDIBSection. Поскольку я хочу сделать размер массива (который будет содержать значение каждого пикселя монитора) гибким, чтобы он соответствовал монитору разного размера, я создаю динамический массив беззнаковых символов (каждый цветовой канал составляет 1 байт).

Однако, когда я запускаю программу, она вылетает прямо на этапе удаления массива, ближе к концу программы.

Я попытался вернуть массив к исходному типу, то есть unsigned char*, так как я подозревал, что он был преобразован в void** при передаче в CreateDIBSection(), но это не сработало.

Ниже приведен код, ценим все советы.

#include <Windows.h>
#include <cstdint>

HWND m_hwnd;

void GetBitMapInfo(const int& x_Coordinate, const int& y_Coordinate, const int& iWidth, const int& iHeight)
{
DWORD imageSize = iWidth * iHeight * 4; 

// Get the display window
HDC displayWindow = GetDC(m_hwnd);
HDC hdc = CreateCompatibleDC(displayWindow);

// Fill in the Bitmap information
BITMAPINFO bmpInfo;
ZeroMemory(&bmpInfo, sizeof(BITMAPINFO));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = iWidth;
bmpInfo.bmiHeader.biHeight = iHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage = 0; 
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;

// Create the storage for the pixel information
uint8_t* image = new uint8_t[imageSize];

// Populate the storage with the BMP pixel information
HBITMAP hBitmap = CreateDIBSection(hdc, &bmpInfo, DIB_RGB_COLORS, (void**)(&image), nullptr, NULL);

SelectObject(hdc, hBitmap);
BitBlt(hdc, x_Coordinate, y_Coordinate, iWidth, iHeight, displayWindow, 0, 0, SRCCOPY);

delete[] image; //Program crashed here: identifier "image" is undefined
image = nullptr;
DeleteDC(hdc);
DeleteDC(displayWindow);
DeleteObject(hBitmap);

return;
}

int main()
{
    GetBitMapInfo(0, 0, 1920, 1080);    
    return 0;
}

1 ответ

Решение

В CreateDIBSection функция сделать указатель

... получает указатель на расположение значений битов DIB.

Память, которую вы выделили image теряется (утечка памяти), и новый указатель не может быть передан в delete[](что приведет к неопределенному поведению).

В документации указано, что с нулевым указателем hSection память, выделенная CreateDIBSection будет освобожден DeleteObject.

Другие вопросы по тегам