2 xiaonvzi5678 xiaonvzi5678 于 2013.09.30 21:29 提问

内存泄露?内存一直不断增长,纠结~~看不出来哪里泄露了,大神指点!

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include
#include
#include
using namespace Gdiplus;
#pragma comment(lib,"gdiplus")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")

int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName)
{

HDC hDC; //设备描述表
int iBits;//当前显示分辨率下每个像素所占字节数
WORD wBitCount;//位图中每个像素所占字节数

DWORD dwPaletteSize=0;//定义调色板大小
DWORD dwBmBitsSize;//位图中像素字节大小
DWORD dwDIBSize;// 位图文件大小
DWORD dwWritten;//写入文件字节数
BITMAP Bitmap;//位图结构
BITMAPFILEHEADER bmfHdr; //位图属性结构
BITMAPINFOHEADER bi; //位图文件头结构
LPBITMAPINFOHEADER lpbi; //位图信息头结构 指向位图信息头结构
HANDLE fh = NULL;//定义文件句柄
HANDLE hDib;//分配内存句柄
HANDLE hPal;//分配内存句柄
HANDLE hOldPal=NULL;//调色板句柄

//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 16;
else if (iBits<=32)
wBitCount = 24;
//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) sizeof(RGBQUAD);
//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)
4*Bitmap.bmHeight ;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
if (lpbi==NULL)
{
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return 0;
}
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);
//恢复调色板

if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}
//创建位图文件

fh = CreateFile(lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE)
{
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return FALSE;
}
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwPaletteSize + dwBmBitsSize;

bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除

GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return 1;
}

HBITMAP GetCaptureBmp()

{
HDC hDC;

HDC MemDC;

BYTE* Data;

HBITMAP hBmp;

BITMAPINFO bi;

memset(&bi, 0, sizeof(bi));

bi.bmiHeader.biSize = sizeof(BITMAPINFO);
bi.bmiHeader.biWidth = GetSystemMetrics(SM_CXSCREEN);

bi.bmiHeader.biHeight = GetSystemMetrics(SM_CYSCREEN);

bi.bmiHeader.biPlanes = 1;

bi.bmiHeader.biBitCount = 24;

hDC = GetDC(NULL);

MemDC = CreateCompatibleDC(hDC);

hBmp = CreateDIBSection(MemDC, &bi, DIB_RGB_COLORS, (void**)&Data, NULL, 0);

SelectObject(MemDC, hBmp);

BitBlt(MemDC, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight,hDC, 0, 0, SRCCOPY);

ReleaseDC(NULL, hDC);

DeleteDC(MemDC);

return hBmp;

}

int tmain(int argc, _TCHAR* argv[])
{
char receiveName[128] = "\0";
while(1)
{
time_t now_time;
now_time = time(NULL);
struct tm *local,*ptr;
local=localtime(&now_time);//localtime()函数是将日历时间转化为本地时间
sprintf(receiveName,"E:\%d-%d-%d
%d-%d-%d_OK.png\0",
local->tm_year + 1900,local->tm_mon + 1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);
HBITMAP hBmp;
hBmp = GetCaptureBmp();
SaveBitmapToFile(hBmp, receiveName);
Sleep(1000);
}
return 0;
}

1个回答

VisualEleven
VisualEleven   Ds   Rxr 2015.01.04 19:37

CreateDIBSection:

As noted above, if hSection is NULL, the system allocates memory for the DIB. The system closes the handle to that memory when you later delete the DIB by calling the DeleteObject function. If hSection is not NULL, you must close the hSection memory handle yourself after calling DeleteObject to delete the bitmap.

You cannot paste a DIB section from one application into another application.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
MySQL内存逐渐增长导致数据库挂起-解决方案?
MySQL内存逐渐增长导致数据库挂起-解决方案?原创 2018-03-17 徐春阳 数据库随笔      Memory usage gradually increases and brings server to halt。      前几天提到发现某系统MySQL数据库内存疑似泄露, 见链接:   在MySQL 5.7.18或以上版本发现疑似内存泄露的现象 。收到一些网友的反馈,他们也都说在使用...
android 内存泄露原因以及排查和解决方案
Android内存泄露,大家在开发中一般都会遇到,特别是在快要发版的时候,各种泄露的问题都在等待解决。 为什么会产生内存泄漏?当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。内存泄漏对程序的影响?内存泄漏是造成应用程序OOM的主要原因之一!我们知道Android系统为每个应
IE8 内存一直增长 内存泄露
最近开发的时候对页面使用了定时的局部更新,结果在ie6,7和Firefox下,一切正常,而在ie8下过上几个小时就浏览器就崩溃了,显示是内存溢出,我以为是代码写的不好导致内存泄露,但是ie6,7又正常,调查了一下,原来这是ie8的bug。  问题点  在IE8中,生成特定Dom节点所占用的内存是不会被释放的,即使这些节点被删除内存也不会被释放。  内存泄露的节点类型包括:form
内存不断增长的BUG
调试软件时,发现内存总在小规模地增长,因为这个程序是需要长时间运行的,觉得很不爽。开始以为是vector函数erase时cache的问题,然后自己用数组实现,仍然出现这个问题。进入调试模式,dump信息也没有留下memory leak的足迹,诚惶诚恐之中,发现了这么一句:OnPaint(){    CPaintDc dc(this);    OnDraw(GetDC());}第六感觉得这里有点问题
程序运行内存占用不断增大
1.考虑有没有日志类,如果程序在运行时不断向控件中写日志,而又没有采用控制日志条目,则内存会一直增大。
Android空白Activity内存不断增长问题
android新建工程,安装运行到小米Note4,查看Monitors下Memory内存情况一直增加,直到free内存用光触发GC,或手动GC.内存可以释放,但还会继续增加,反复运行,但当切换Activity到后台后过一会再回来,内存保持不变,内存过度使用情况消失。一个正常的功能内存应该是比较平滑的,造成这个问题的原因肯定是有程序不低创建对象,没有采取对象复用,浪费系统资源,容易造成内存溢出。不知...
java项目res内存不断增大
1.top 查看pid 11112 2.top -H -p 11112 查看线程占用比例 得到线程11140 比较高 3. printf %x 11140 转换为16进制 2b84 4.jstack 11112 | grep 2b84 -A 30 jdk的bin目录下查看代码
关于 ADO 内存泄露 内存增长 的一些个人观点及解决方案
[本文最初发表于:http://blog.csdn.net/wwwwws/article/details/7417349,转载请保留出处及本声明]         当我们开发一个ADO客户端程序时,经常会发现程序运行以后,其拥有(占用)的虚拟内存大小不断增加,在一般情况下我们并不希望这样的事情发生,因此我们需要进行一些额外的配置。        首先,先来分析一下内存增长的原因。内存增长的可能
android 重复进入app heapSize不断增大的问题
最近项目中碰到了一个特别奇葩的问题,上stackoverflow搜索了半天,最后终于一句话解决了,system.exit(0);没错,相信程序中都存在双击退出程序的功能,但是我用DDMS分析应用程序的内存,发现当我重复进入一个Activity的时候,内存长的很快,当然这块涉及到内存优化的问题,内存的bug是我程序中持有了Activity的全局引用,并放到了一个静态的list中导致的,所以时间长了,
asp.net使用Ajax+jquery+定时器,在IE(8--9)中导致内存无限增长,内存泄露
jquery+ajax+定时器使访问网站的电脑内存一直增长,导致内存溢出,并且网站会出现无法响应现象的一些解决心得。