указатели — логическое значение для распределения памяти при управлении моими объектами в переполнении стека

У меня есть некоторые проблемы с моим дизайном для функции, и я не могу найти правильное решение (я довольно новичок в C ++).

Несколько дней назад я спрашиваю Другой вопрос который связан с этим.

Итак, у меня есть функция, которая делает снимок экрана. Работает отлично.
Дело в том, что я хочу, чтобы эта функция возвращала Image объект из класса, который я реализовал.

В основном это:

class Image {
public:
BYTE *bitPointer;
int width;
int height;
};

И моя функция такая:

Image screenCapture(int width, int height) {

HDC hdcTemp, hdc;
BYTE* bitPointer;

hdc = GetDC(HWND_DESKTOP);
hdcTemp = CreateCompatibleDC(hdc);

BITMAPINFO bitmap;
bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = width;
bitmap.bmiHeader.biHeight = -height;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 24;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 0;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;
HBITMAP hBitmap = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
SelectObject(hdcTemp, hBitmap);
BitBlt(hdcTemp, 0, 0, width, height, hdc, 0, 0, SRCCOPY);
ReleaseDC(HWND_DESKTOP, hdc);
DeleteDC(hdcTemp);

Image screen;
screen.bitPointer = bitPointer;
screen.width = width;
screen.height = height;

return screen;
}

bitPointer создан с использованием CreateDIBSection на самом деле указатель на значение моего первого пикселя (если я правильно понял).

Затем я могу использовать простой цикл:

for (int i = 0; i >= 0; i++) {
cout << i << ": " << (int)screenCapture(1366, 768).bitPointer[0] << endl;
}

Вот моя проблема.

Я должен освободить hBitmap позвонив DeleteObject(hBitmap) в противном случае у меня не было бы больше места в памяти (и цикл, в конце концов, рухнул)

Однако я не знаю где сделать это.

Я хотел бы сделать это в рамках моей функции, но если я позвоню DeleteObject()тогда это уничтожит мою bitPointer и поэтому я не смогу получить доступ к пикселям из моего Image объект вернулся.
На самом деле, я немного запутался с тем, что мой bitPointer переменная является указателем. Это означает, что я не могу скопировать его, чтобы предотвратить его уничтожение после. Я не могу найти решение.

Два решения, которые я попробовал:

  • Создать деструктор вызова DeleteObject() для моего класса Image,
    Это не сработало, потому что деструктор вызывается из функции, а не только из моего цикла.
  • Добавить атрибут HBITMAP hBitmap в мой класс Imageи позвоните DeleteObject() из моей петли.
    Это не очень удобно, более того, я должен объявить новый объект Image, я не могу сделать это анонимно, как в цикле, который я написал.

Итак, я застрял, кто-нибудь может мне помочь, пожалуйста?

0

Решение

Вы можете передать hBitmap в качестве аргумента функции screenCapture.

screenCapture(int width, int height, HBITMAP& hBitmap)

Таким образом, вы можете уничтожить его, когда захотите, не мешая членам Image. Вы объявляете «пустой» hBitmap снаружи скриншот функция и передать его в качестве аргумента. Функция будет использовать ссылку для создания объекта, и вы сможете уничтожить его вне screenCapture после того, как закончите с использованием bitPointer ценности.

если ты необходимость сохраняя все скриншоты, вам нужно реализовать рабочий буфер, так как у вас ограниченный объем памяти.

1

Другие решения


По вопросам рекламы [email protected]