请教:vc载入BMP图片时资源泄露

chencunzhu 2009-08-28 10:07:31
载入的bmp文件2.5M,每次运行这段代码都会有5M左右的内存泄露
我不太熟悉如何释放资源,后边的释放资源部分可能不对,反复试验都不成。不晓得如何释放,高手请给看一下,困扰我两天多了,谢谢
void CprintPreview::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC *hdcprint=&dc;
CDC memDC;
CBitmap bitmap;
BITMAP bm;
HBITMAP hbitmap=(HBITMAP)LoadImage(0,"C:\\PIA\\datacurveReport.bmp",IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

GetObject(hbitmap, sizeof(BITMAP), (LPBYTE)&bm);
int bmpWidth =bm.bmWidth;
int bmpHeight=bm.bmHeight;

memDC.CreateCompatibleDC(hdcprint);
bitmap.CreateCompatibleBitmap(hdcprint,bmpWidth,bmpHeight);
bitmap.Attach(hbitmap);
bitmap.GetObject(sizeof(bm),&bm);
CBitmap *pOldBitmap = (CBitmap *)memDC.SelectObject(&bitmap);
if(pOldBitmap == NULL)
{
memDC.DeleteDC();
DeleteObject( &bitmap );
bitmap.DeleteObject();
AfxMessageBox(_T("Not enough resource."));
return;
}
hdcprint->StretchBlt(0, 0, bmpWidth, bmpHeight, &memDC,0, 0, bmpWidth,bmpHeight, SRCCOPY);

memDC.SelectObject(pOldBitmap);

bitmap.Detach();

DeleteObject( hbitmap );
bitmap.DeleteObject();
DeleteObject( &bitmap );

if(!memDC.DeleteDC() )
AfxMessageBox("fail delete memDC");
hdcprint->DeleteDC();
ReleaseDC(hdcprint);
}
...全文
147 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
aa3000 2009-08-28
写错了...

CPaintDC dc(this); // device context for painting
CDC *hdcprint=&dc;
CDC memDC;
CBitmap bitmap;
BITMAP bm;
HBITMAP hbitmap=(HBITMAP)LoadImage(0,"C:\\PIA\\datacurveReport.bmp",IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

GetObject(hbitmap, sizeof(BITMAP), (LPBYTE)&bm);
int bmpWidth =bm.bmWidth;
int bmpHeight=bm.bmHeight;

memDC.CreateCompatibleDC(hdcprint);
bitmap.Attach(hbitmap);
CBitmap *pOldBitmap = (CBitmap *)memDC.SelectObject(&bitmap);
hdcprint->StretchBlt(0, 0, bmpWidth, bmpHeight, &memDC,0, 0, bmpWidth,bmpHeight, SRCCOPY);

memDC.SelectObject(pOldBitmap);

bitmap.DeleteObject();

if(!memDC.DeleteDC() )
AfxMessageBox("fail delete memDC");
回复
rambo_ghaip 2009-08-28
开始,你用hbitmap指向了磁盘上的图片.
HBITMAP hbitmap=(HBITMAP)LoadImage(0,"C:\\PIA\\datacurveReport.bmp",IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

后来,你又用hbitmap指向了你创建的图
bitmap.CreateCompatibleBitmap(hdcprint,bmpWidth,bmpHeight);
bitmap.Attach(hbitmap);

所以原先磁盘上加载的图片占用的资源就没有释放
回复
aa3000 2009-08-28
CPaintDC dc(this); // device context for painting
CDC *hdcprint=&dc;
CDC memDC;
CBitmap bitmap;
BITMAP bm;
HBITMAP hbitmap=(HBITMAP)LoadImage(0,"C:\\PIA\\datacurveReport.bmp",IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

GetObject(hbitmap, sizeof(BITMAP), (LPBYTE)&bm);
int bmpWidth =bm.bmWidth;
int bmpHeight=bm.bmHeight;

memDC.CreateCompatibleDC(hdcprint);
bitmap.Attach(hbitmap);
CBitmap *pOldBitmap = (CBitmap *)memDC.SelectObject(&bitmap);
if(pOldBitmap == NULL)
{
memDC.DeleteDC();
bitmap.DeleteObject();
AfxMessageBox(_T("Not enough resource."));
return;
}
hdcprint->StretchBlt(0, 0, bmpWidth, bmpHeight, &memDC,0, 0, bmpWidth,bmpHeight, SRCCOPY);

memDC.SelectObject(pOldBitmap);

bitmap.DeleteObject();

if(!memDC.DeleteDC() )
AfxMessageBox("fail delete memDC");

回复
youyifang 2009-08-28
pOldBitmap 资源释放看看
回复
dirdirdir3 2009-08-28
GetObject(hbitmap, sizeof(BITMAP), (LPBYTE)&bm);
int bmpWidth =bm.bmWidth;
int bmpHeight=bm.bmHeight;

memDC.CreateCompatibleDC(hdcprint);
bitmap.Attach(hbitmap);
bitmap.GetObject(sizeof(bm),&bm);
CBitmap *pOldBitmap = (CBitmap *)memDC.SelectObject(&bitmap);
hdcprint->StretchBlt(0, 0, bmpWidth, bmpHeight, &memDC,0, 0, bmpWidth,bmpHeight, SRCCOPY);

回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
图形处理/算法
创建于2007-09-28

1.9w+

社区成员

VC/MFC 图形处理/算法
申请成为版主
帖子事件
创建了帖子
2009-08-28 10:07
社区公告
暂无公告