fesoalll Postado Abril 4, 2016 Denunciar Share Postado Abril 4, 2016 Preciso de uma ajuda com esse codigo. Toda vez que a função screen() é chamada a memoria alocada não é liberada, fazendo aumentar o uso da memoria RAM até travar o pc. Como faço pra liberar essa memoria , segue o codigo: #include <iostream> #ifdef WIN32 #include <windows.h> #else #include <unistd.h> #endif // win32 using namespace std; void sleepcp(int milliseconds); char filename[64]; FILE* f; void screen(char* fileName) { HWND window = GetDesktopWindow(); HDC _dc = GetWindowDC(window); HDC dc = CreateCompatibleDC(0); RECT re; GetWindowRect(window, &re); int w = re.right, h = re.bottom; void* buf = malloc(w*h*4); HBITMAP bm = CreateCompatibleBitmap(_dc, w, h); SelectObject(dc, bm); StretchBlt(dc, 0, 0, w, h, _dc, 0, 0, w, h, SRCCOPY); void* f =CreateFile(fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); GetObject(bm, 84, buf); tagBITMAPINFO bi; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = w; bi.bmiHeader.biHeight = h; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = 0; bi.bmiHeader.biSizeImage = 0; CreateDIBSection(dc, &bi, DIB_RGB_COLORS, &buf, 0, 0); GetDIBits(dc, bm, 0, h, buf, &bi, DIB_RGB_COLORS); BITMAPFILEHEADER bif; bif.bfType = MAKEWORD('B','M'); bif.bfSize = w*h*4+54; bif.bfOffBits = 54; BITMAPINFOHEADER bii; bii.biSize = 40; bii.biWidth = w; bii.biHeight = h; bii.biPlanes = 1; bii.biBitCount = 32; bii.biCompression = 0; bii.biSizeImage = w*h*4; DWORD r; WriteFile(f, &bif, sizeof(bif), &r, NULL); WriteFile(f, &bii, sizeof(bii), &r, NULL); WriteFile(f, buf, w*h*4, &r, NULL); buf=NULL; free(buf); CloseHandle(window); CloseHandle(f); DeleteDC(_dc); DeleteDC(dc); } void sleepcp(int milliseconds) // cross-platform sleep function { #ifdef WIN32 Sleep(milliseconds); #else usleep(milliseconds * 1000); #endif // win32 } int main() { int A=0; char img[30]; for(;;) { sprintf(img,"image%.3i.bmp",A); screen(img); printf("Imagem%.3i.bmp foi salva !\n",A); sleepcp(8000); A++; } return 0; } ATT. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
fesoalll
Preciso de uma ajuda com esse codigo.
Toda vez que a função screen() é chamada a memoria alocada não é liberada, fazendo aumentar o uso da memoria RAM até travar o pc.
Como faço pra liberar essa memoria , segue o codigo:
#include <iostream>
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif // win32
using namespace std;
void sleepcp(int milliseconds);
char filename[64];
FILE* f;
void screen(char* fileName)
{
HWND window = GetDesktopWindow();
HDC _dc = GetWindowDC(window);
HDC dc = CreateCompatibleDC(0);
RECT re;
GetWindowRect(window, &re);
int w = re.right,
h = re.bottom;
void* buf = malloc(w*h*4);
HBITMAP bm = CreateCompatibleBitmap(_dc, w, h);
SelectObject(dc, bm);
StretchBlt(dc, 0, 0, w, h, _dc, 0, 0, w, h, SRCCOPY);
void* f =CreateFile(fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
GetObject(bm, 84, buf);
tagBITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = w;
bi.bmiHeader.biHeight = h;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = 0;
bi.bmiHeader.biSizeImage = 0;
CreateDIBSection(dc, &bi, DIB_RGB_COLORS, &buf, 0, 0);
GetDIBits(dc, bm, 0, h, buf, &bi, DIB_RGB_COLORS);
BITMAPFILEHEADER bif;
bif.bfType = MAKEWORD('B','M');
bif.bfSize = w*h*4+54;
bif.bfOffBits = 54;
BITMAPINFOHEADER bii;
bii.biSize = 40;
bii.biWidth = w;
bii.biHeight = h;
bii.biPlanes = 1;
bii.biBitCount = 32;
bii.biCompression = 0;
bii.biSizeImage = w*h*4;
DWORD r;
WriteFile(f, &bif, sizeof(bif), &r, NULL);
WriteFile(f, &bii, sizeof(bii), &r, NULL);
WriteFile(f, buf, w*h*4, &r, NULL);
buf=NULL;
free(buf);
CloseHandle(window);
CloseHandle(f);
DeleteDC(_dc);
DeleteDC(dc);
}
void sleepcp(int milliseconds) // cross-platform sleep function
{
#ifdef WIN32
Sleep(milliseconds);
#else
usleep(milliseconds * 1000);
#endif // win32
}
int main()
{
int A=0;
char img[30];
for(;;)
{
sprintf(img,"image%.3i.bmp",A);
screen(img);
printf("Imagem%.3i.bmp foi salva !\n",A);
sleepcp(8000);
A++;
}
return 0;
}
ATT.
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.