HBITMAP资源释放问题

jsjlzhq 2010-03-31 09:21:29
首先声明是WIN32编程里面

我定义了一个类,管理图像资源,里面有成员是HBITMAP类型的,构造函数里是LoadImage来加载图像,然后在draw方法里会知道界面,从外部传进来一个dc
memdc = CreateCompatibleDC(dc); //然后创建memdc
orignalbitmap = (HBITMAP)SelectObject(memdc,handle); //选进memdc并保存原来的
BitBlt(dc,rect.left,rect.top,rect.right-rect.left,titleheight,memdc,0,0,SRCCOPY); //绘图
SelectObject(memdc,orignalbitmap); //将原来的还原
DeleteDC(memdc); //释放memdc
这是绘制部分,然后在image类的析构函数中,我调用DeleteObject释放HBITMAP资源
在主函数里有dc的释放部分,都有

我的问题来了
为什么我加载了位图但是最后没有使用,我的程序就崩溃了呢
主要体现在F5调试运行的时候什么事也没有
Ctrl+F5直接崩溃,0x……指令引用的内存0x……不能为read
希望高手指点,感觉是内存泄露,可是没找到问题。
...全文
666 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjlzhq 2010-04-02
  • 打赏
  • 举报
回复
对以上所有关心此话题的人表示感谢,在此也道歉吧,浪费了大家时间
最后我通过不断屏蔽找到了错误原因
根本不是HBITMAP这方面的原因,而只是因为我使用了_tcscpy_s中出错导致的
针对我出的错误大家以后也少犯,列出如下:
name = new TCHAR[_tcslen(text)+1];//注意此处+1
_tcscpy_s(name,_tcslen(text)+1,text);//注意此处+1,并不是_tcslen(name)
谢谢大家,也没有多少分,随便散分了
许文君 2010-04-01
  • 打赏
  • 举报
回复
一个问题是不知道你放在哪儿初始化了。
另一个问题是 orignalbitmap = (HBITMAP)SelectObject(memdc,handle);你先把这句注释掉试试,这样使用个人觉得实在感觉很怪异,做这个动作是否会引起??
feilongjilei 2010-04-01
  • 打赏
  • 举报
回复
一种猜测:
比如
是不是你在 WM_INITDIALOG中 new 了一个Image对象,然后在WM_CLOSE中先调用的 delete 删除这个对象,再调用 EndDialog 结束对话框呀。如果是的话,先EndDialog,再delete 这个 Image对象。
fandh 2010-03-31
  • 打赏
  • 举报
回复
哈哈哈哈,居然是这样!
看GDI资源,是在任务管理器中看的,你可以仔细研究一下任务管理器,里面有选项的!
jsjlzhq 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qqwangbalu 的回复:]
图像是不是没加载成功,句柄一直为空值!
[/Quote]

成功了的,我加判断了的
if(!bitmap)
MessageBox(NULL,"加载图片失败","tip",MB_OK);
jsjlzhq 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ima_zhan 的回复:]
崩溃的时候去堆栈里看看调用了什么函数吧。
[/Quote]

调试的时候不会出现问题,运行的时候没法查看堆栈啊
jsjlzhq 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xianglitian 的回复:]
你的图片是哪来的?
读文件还是资源?
[/Quote]

读文件的
ima_zhan 2010-03-31
  • 打赏
  • 举报
回复
崩溃的时候去堆栈里看看调用了什么函数吧。
向立天 2010-03-31
  • 打赏
  • 举报
回复
你的图片是哪来的?
读文件还是资源?
jsjlzhq 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xianglitian 的回复:]
你是不是引用文件了?
[/Quote]

引用何种文件呢
飞天舞 2010-03-31
  • 打赏
  • 举报
回复
图像是不是没加载成功,句柄一直为空值!
向立天 2010-03-31
  • 打赏
  • 举报
回复
你是不是引用文件了?
jsjlzhq 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]
你在调试的时候,看看你的GDI资源是不是在一直增加?用任务管理器看!
这点代码,看不出什么问题 !
[/Quote]

是看内存么?运行很快也看不出什么变化啊?
还有你说的初始化,是所谓哪些?例如?
fandh 2010-03-31
  • 打赏
  • 举报
回复
还有,就是一些初始化是否做好了?
fandh 2010-03-31
  • 打赏
  • 举报
回复
你在调试的时候,看看你的GDI资源是不是在一直增加?用任务管理器看!
这点代码,看不出什么问题 !
jsjlzhq 2010-03-31
  • 打赏
  • 举报
回复
还有上面的绘制操作只是位图的绘制
jsjlzhq 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 visualeleven 的回复:]
orignalbitmap = (HBITMAP)SelectObject(memdc,handle); //选进memdc并保存原来的
这里的handle是什么HBITMAP嘛?有没有重复加载的问题呢?
[/Quote]

这里的handle是位图句柄,其实我是位图,图标用的一个类进行加载的
在构造函数里加载图片

Image::Image(HINSTANCE instance,TCHAR* filename,int flag)
{
switch(flag)//flag标示创建的是何种对象,位图,光标,图标
{
case 0:
handle = LoadImage(instance,filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); /* 创建位图句柄 */
break;
case 1:
handle = LoadImage(instance,filename,IMAGE_ICON,0,0,LR_LOADFROMFILE|LR_SHARED); /* 创建图标句柄 */
break;
case 2:
handle = LoadImage(instance,filename,IMAGE_CURSOR,0,0,LR_LOADFROMFILE|LR_SHARED); /* 创建光标句柄 */
break;
}
if(!handle)
{
MessageBox(NULL,_T("加载图片失败"),_T("tip"),MB_OK);
}
this->flag = flag;
}

Image::~Image(void)
{//析构函数销毁句柄
switch(flag)
{
case 0:
DeleteObject((HBITMAP)handle);
break;
case 1:
DestroyIcon((HICON)handle);
break;
case 2:
DestroyCursor((HCURSOR)handle);
break;
}
}
//绘制
void Image::DrawImage(HDC dc,const RECT& rect)
{
BITMAP bp;
HDC memdc;
HBITMAP orignalbitmap;
memdc = CreateCompatibleDC(dc);
GetObject(handle,sizeof(BITMAP),&bp);
orignalbitmap = (HBITMAP)SelectObject(memdc,handle);
BitBlt(dc,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,memdc,0,0,SRCCOPY);
SelectObject(memdc,orignalbitmap);
DeleteDC(memdc);
}
Image类中就俩成员变量
HANDLE handle;
int flag;
这几乎是所有的Image类了
Eleven 2010-03-31
  • 打赏
  • 举报
回复
orignalbitmap = (HBITMAP)SelectObject(memdc,handle); //选进memdc并保存原来的
这里的handle是什么HBITMAP嘛?有没有重复加载的问题呢?
jsjlzhq 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 i_nbfa 的回复:]
memdc是HDC还是CDC对象?
[/Quote]

HDC
我用的win32编程
向立天 2010-03-31
  • 打赏
  • 举报
回复
F5是调试
ctrl+F5是运行不调试
调试模式IDE会对你的程序进行监管
不调试相当于你自己去debug文件夹下运行程序
主要区别其实就是路径的问题
不过你这个问题确实有些怪
我建议你屏蔽一些代码再试试
只有将问题定位到具体代码上才能跟本解决
加载更多回复(7)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧