永发信息网

我用MFC编写了一个程序,资源释放的问题

答案:4  悬赏:60  手机版
解决时间 2021-02-23 17:30
自己编写的程序,但是在使用一段时间之后任务管理器中会显示他使用了很大的内存,但是在最小化 还原之后会释放很多内存,我想知道怎样自动释放这些内存。
帮我解决问题的可继续加分 如果想碰碰运气就算了,不能解决问题我是不会给分的

1内存泄漏的问题我基本上都考虑了,基本上没有泄漏的问题,一般我都释放掉了,也不会重复的去NEW一些东西,其实我就是想知道怎样才能实现系统的最小化最大化的操作
2还有就是我由于是自己美化的页面,但是工作一段时间后图像会花掉,有没有人能提供一些自己美化加入背景图的代码。
3一楼的太搞了,一个工程少说也有上万行代码,不好发啊,呵呵
最佳答案
凡动态分配了存储单元的变量,一旦不用,就要释放。
例如动态数组,不管用new,还是 malloc分配的。就要 delete 或 free. 这点,你会注意的。

但MFC程序有些地方 动态分配存储单元 对程序员来说,不能“明显看出”。 由于MFC程序是事件驱动程序,有许多子程序(函数)是不断循环执行的。这些 不能“明显看出”的 动态分配,正因为不会自动释放, 才会引起泄漏。

例如 CView OnDraw()里,如果你 建了一个 font, "画" 完字,不用了,就要释放。
CFont font;
font.CreateFontIndirect(&lf); // 这个过程隐含了分配
....
DeleteObject(font); // 不用了,就要释放

例如, 调色盘
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
....
delete[] pLP; // 不用了,就要释放

例如, 句柄
HANDLE hDIB = DDBToDIB( bitmap, BI_RGB, &pal ); // 这个过程隐含了分配
....
GlobalFree( hDIB ); // 不用了,就要释放

MFC程序比较复杂,你的泄漏是怎样引起的,要自己查找。上次有位提问的朋友,就是 CFont font; 泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。
全部回答
你吧问题说的很泛啊,首先这样我们很不容易对你的问题进行准确定位。。。 按照你说的现象,可能是你在显示的过程中造成了很大的内存泄露。 请检查有没有类似CDC的GetDC()和ReleaseDC(),CBitmap的Attach和Detach(),以及LoadImage()和DeleteObject()这样的绝对配对错误,它们如果不配对会造成严重的内存泄露。
自动释放不可能啊,堆的内存,自己释放,就是说内存管理问题 我有个办法,给一个宏,打印出所有的new的代码,包括strdup这样的方法,然后就打印在output中了 code: char szStrAddress[500] = {0}; \ sprintf_s(szStrAddress, sizeof(szStrAddress), "%s(%d): 内存地址:(0X%x) \n", __FILE__, __LINE__, psz); \ 我的这个是通用的,还就就是重写delete和new方法,这个百度一下一大堆~~
cpen、cbrush或cfont等一般通过createxxx()来建立, 如: cpen pen; pen.createpen(...); 如果再次调用createpen(...);前没有用pen.deleteobject();则会出错. cdc的话 建议释放对象cdc; 用releasedc(&cdc); 我记得以前有个程序没有释放,结果打开任务管理器,看到程序所占内存不断在增,释放后就解决了。 补充: 理论我知道的不多,我还是举例说下自己的感觉: 假设你把这段代码写到了一个按钮事件里,如: onbutton1(){ hdc hdc=getdc(hwnd); cdc cdc; cdc.attach(hdc); cdc.textout(0,0,"ok"); } 没有释放cdc,那么你运行程序,打开任务管理器,查看你程序进程,然后猛点那个按钮,你应该会看到内存占用在不断增加,如果释放了应该就不会出现这样的情况,这个是我碰到的情况,至于不释放会不会有其他情况我也不太清楚. 对于像cpen cbrush 等,假设有如下的代码: cbrush br; br.createsolidbrush(rgb(0,0,0));//黑色刷子 ... br.deleteobject();//释放br br.createsolidbrush(rgb(255,0,0));//红色刷子 ... br.deleteobject();//释放br 如果不释放掉那个黑色的刷子,运行br.createsolidbrush(rgb(255,0,0));一句来创建红色刷子时会出错.应该就是没有释放掉黑色刷子导致的.当然你可以用两个cbrush对象br1,br2. 但还是建议用完后用个deleteobject();
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
一匹马在跑且一路灰尘的成语
怎么查询动车票是否订购成功
怎样选苹果
西安外国语大学长安校区附近有什么比较好的小
【四季变迁是由什么引起的】地球的四季变迁是
面丸子是发面的好还是死面的好
南通市崇川区遂生堂大药房学田店中医坐堂医诊
钓鱼台香烟多少钱一条
聚龙武馆地址在哪,我要去那里办事
请问怎么在stand o'food city中拆除餐馆
大豪庄园地址在什么地方,想过去办事
字母H N 0 M S F X中,是轴对称图形的字母有_
All the people are having fun in the
为什么老鼠不会倒着走?
祖父给孙辈的结婚贺简
推荐资讯
星耀休闲小站地址在什么地方,想过去办事
该图为东非高原基塔莱和多多马的降水资料及两
彭宇今晚去了哪里 主持人彭宇今晚怎么没主持
请问,行云流水大师请进:,不知你对我的提问有
男生和女生在失恋后的表现有什么不同?
弯头的长度测量“急用”45度60度90度每个弯头
蚶子和豆浆能同时食用吗
怎么老弹出0x016139b6指令引用的0x
永巷的历史记载
奶油里加凝白怎么回事
衙内茶庄地址有知道的么?有点事想过去!
C语言,输入20个字符字符串,反序后输出,要
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?