作者:凌亂的回譩 | 来源:互联网 | 2023-05-17 19:47
在程序中,我每一分钟做一次拷屏操作:
代码如下:
......
TCanvas *dtCanvas = new TCanvas;
dtCanvas->Handle=GetDC(0);
Graphics::TBitmap *bitmap=new Graphics::TBitmap;
bitmap->Width=Width;
bitmap->Height=Height;
int nColors=GetDeviceCaps(Canvas->Handle,SIZEPALETTE);
LOGPALETTE* logPal=(LOGPALETTE*)new Byte[sizeof(LOGPALETTE)+(nColors-1)*sizeof(PALETTEENTRY)];
logPal->palVersion=0x300; logPal->palNumEntries=(Word)nColors;
GetSystemPaletteEntries(Canvas->Handle,0,nColors,logPal->palPalEntry);
bitmap->Palette=CreatePalette(logPal);
delete[] logPal;
TRect src=BoundsRect;
TRect dest=Rect(0,0,Width,Height);
bitmap->Canvas->CopyRect(dest,dtCanvas,src);
bitmap->SaveToFile("Screen"+IntToStr(i)+".bmp"); (i在前面已经定义)
delete bitmap;
delete dtCanvas;
发现50分钟后,系统报错:
out of system resource.
(重新运行50分钟后,同样出问题。)
问题在哪里?
8 个解决方案
系统资源不足,你的代码有些问题,有些东西使用后没有释放,你要检查一下的代码,比如说:GetDC获得的设备描述表,最后应用ReleaseDC进行释放,CreateDC获得的设备描述表,最后应用DeleteDC释放。
dtCanvas->Handle=GetDC(0);
对应:ReleaseDC(0)?
GetDeviceCaps(Canvas->Handle,SIZEPALETTE)
对应:ReleaseDeviceCaps(Canvas->Handle,SIZEPALETTE)?
CreatePalette(logPal);
对应:DeletePalette(logPal)?
小弟不才,初学BCB,尚未接触过这些东西,请指教。
我不是这个意思,对于CreateDC,GetDC,是这样的.对于调色板,位图,画笔,画刷,不是用Release*****,而是用DeleteObject将它进行删除。
具体到我这几行代码,该怎样写?我不了解着方面的知识。
谢谢!
有2处内存泄漏。1.使用GetDC后,没有使用ReleaseDC释放。2.使用CreatePalette得到的调色盘句柄,没有用DeleteObject释放。修改后的代码如下:
TCanvas *dtCanvas = new TCanvas;
dtCanvas->Handle=GetDC(0);
Graphics::TBitmap *bitmap=new Graphics::TBitmap;
bitmap->Width=Width;
bitmap->Height=Height;
int nColors=GetDeviceCaps(Canvas->Handle,SIZEPALETTE);
LOGPALETTE* logPal=(LOGPALETTE*)new Byte[sizeof(LOGPALETTE)+(nColors-1)*sizeof(PALETTEENTRY)];
logPal->palVersion=0x300; logPal->palNumEntries=(Word)nColors;
GetSystemPaletteEntries(Canvas->Handle,0,nColors,logPal->palPalEntry);
HPALETTE hPal = CreatePalette(logPal);
bitmap->Palette = hPal;
delete[] logPal; DeleteObject(hPal);
TRect src=BoundsRect;
TRect dest=Rect(0,0,Width,Height);
bitmap->Canvas->CopyRect(dest,dtCanvas,src);
bitmap->SaveToFile("Screen"+IntToStr(i)+".bmp"); (i在前面已经定义)
ReleaseDC(0, dtCanvas->Handle);
delete dtCanvas; delete bitmap;
是用delete[] logPal; 还是delete logPal;?
因为经过了类型转换,我也没有这样用过。我认为应该是delete logPal;最好
写成 delete[] (BYTE*)logPal; 这样就和new一致了。