C++ 屏幕截图代码工作,但继续占用RAM并崩溃

C++ 屏幕截图代码工作,但继续占用RAM并崩溃,c++,winapi,screenshot,sfml,C++,Winapi,Screenshot,Sfml,我正在尝试制作一个程序,它可以制作整个桌面或特定窗口的屏幕截图,并将其绘制在SFML窗口中。最初它运行正常,但10秒后它停止捕获。我还注意到它继续消耗RAM,即使我们谈论的是每秒仅20kb。我试图加入网络上的代码。当它停止工作时,它会打印2,然后打印无限1,从代码中您很快就会知道这些错误在哪里 包括 包括 HBITMAP屏幕快照与hParent、int x、int y、int nWidth、int nHeight { //从父窗口获取DC HDC HDC=GetDChParent; //创建一个

我正在尝试制作一个程序,它可以制作整个桌面或特定窗口的屏幕截图,并将其绘制在SFML窗口中。最初它运行正常,但10秒后它停止捕获。我还注意到它继续消耗RAM,即使我们谈论的是每秒仅20kb。我试图加入网络上的代码。当它停止工作时,它会打印2,然后打印无限1,从代码中您很快就会知道这些错误在哪里

包括 包括 HBITMAP屏幕快照与hParent、int x、int y、int nWidth、int nHeight { //从父窗口获取DC HDC HDC=GetDChParent; //创建一个内存DC以将图片存储到 HDC hMemDC=CreateCompatibleDChDC; //创建真实的图片 HBITMAP hBackground=CreateCompatibleBitmaphDC,nWidth,nHeight; //选择对象并存储我们得到的结果 HBITMAP hOld=HBITMAPSelectObjecthMemDC,hBackground; //现在将实际绘制到MemDC中,结果将在选定对象中 //注:我们要求返回0,0,宽度,高度,并从x,y取一个blit BitBlthMemDC,0,0,nWidth,nHeight,hDC,x,y,SRCCOPY; //恢复旧位图(如果有) 选择ObjectHMEMDC,按住; //释放我们创建的DC 发布HPARENT,hMemDC; 释放HPARENT,hDC; //返回图片不是一个干净的方法,但你得到了演练 返回背景; } bool SFMLLoadHBitmapAsImageHBITMAP hBitmap,sf::Image*pPicture { HWND hParent=FindWindowNULL,文本计算器; //如果hParent==NULLprintf%s,则为w; //创建DC以获取hBitmap信息 HDC HDC=GetDChParent; //创建BITMAPINFO变量,设置大小 BITMAPINFO MyBMInfo={0}; MyBMInfo.bmiHeader.biSize=sizeofMyBMInfo.bmiHeader; //从位图获取BITMAPINFO结构 如果0==GetDIBitshDC,hBitmap,0,0,NULL,&MyBMInfo,DIB\u RGB\u颜色 { printf%s,1; 返回false; } //创建位图像素数组,每个元素为[b,g,r] BYTE*lpPixels=新字节[MyBMInfo.bmiHeader.biSizeImage]; //设置要接收的缓冲区的结构 MyBMInfo.bmiHeader.biCompression=BI_RGB;//无压缩 //现在从图片中获取实际数据 如果0==getDibitHDC,hBitmap,0,MyBMInfo.bmiHeader.biHeight,LPVOIDlpPixels,&MyBMInfo,DIB_RGB_颜色 { printf%s,2; 返回false; } //现在创建一个要填充的SFML像素数组 sf::Uint8*lpPixelWithAlpha=新sf::Uint8[MyBMInfo.bmiHeader.biSizeImage+ MyBMInfo.bmiHeader.biSizeImage/3/3];//为alpha添加空间 //循环通过每个像素,以四个RGBA的步骤! 对于int x=0;xcreateMyBMInfo.bmiHeader.biWidth, MyBMInfo.bmiHeader.biHeight,lpPixelWithAlpha; //使用alphachannel删除像素 删除[]lpPixelWithAlpha; //释放DC 已发布的HParent,hDC;/::GDW //通知好的! 返回true; } int main { ..... hBitmap=ScreenShotFindWindowNULL,TEXTCalculator,0,060400; SFMLLoadHBitmapAsImagehBitmap和图片; ..... }
您可能有很大的内存泄漏。是否正在清理调用屏幕截图返回的hBitmap?你发布的代码没有。如果GetDIBits返回零,您也不会清除lpPixels。改用std::vector。问题是每秒只有20~kb,正如您从每次使用new时使用delete[]的代码中所看到的那样。所以我不知道漏洞在哪里。我检查了一下,当它达到35MB的内存时,它停止捕获,这算不了什么。。。编辑:是的,我主要清理了hBitmap,但我没有发布。你必须在hMemDC上调用DeleteDC或DeleteObject-自从你创建了它以来,ReleaseDC是不够的。因为这与问题有关,所以请发布清理的代码。但并非每次新建[]时都会调用delete[]:如果GetDIBits返回零,则返回false;没有清理内存。使用std::vector,您不必费心手动内存管理。您可能有大量内存泄漏。您是否正在清理调用屏幕截图返回的hBitmap?你发布的代码没有。如果GetDIBits返回零,您也不会清除lpPixels。改用std::vector。问题是每秒只有20~kb,正如您从每次使用new时使用delete[]的代码中所看到的那样。所以我不知道漏洞在哪里。我检查了一下,当它达到35MB的内存时,它停止捕获,这算不了什么。。。编辑:是的,我主要清理了hBitmap,但我没有发布。你必须调用DeleteDC或DeleteObject
在hMemDC上-ReleaseDC是不够的,因为它是您创建的。因为这与问题相关,所以一定要发布清理的代码。但并非每次新建[]时都会调用delete[]:如果GetDIBits返回零,则返回false;没有清理内存。使用std::vector,您不必费心手动管理内存。