自己编写的程序,但是在使用一段时间之后任务管理器中会显示他使用了很大的内存,但是在最小化 还原之后会释放很多内存,我想知道怎样自动释放这些内存。
帮我解决问题的可继续加分 如果想碰碰运气就算了,不能解决问题我是不会给分的
1内存泄漏的问题我基本上都考虑了,基本上没有泄漏的问题,一般我都释放掉了,也不会重复的去NEW一些东西,其实我就是想知道怎样才能实现系统的最小化最大化的操作
2还有就是我由于是自己美化的页面,但是工作一段时间后图像会花掉,有没有人能提供一些自己美化加入背景图的代码。
3一楼的太搞了,一个工程少说也有上万行代码,不好发啊,呵呵
我用MFC编写了一个程序,资源释放的问题
答案:4 悬赏:60 手机版
解决时间 2021-02-23 17:30
- 提问者网友:我的未来我做主
- 2021-02-23 07:46
最佳答案
- 五星知识达人网友:鱼忧
- 2021-02-23 08:51
凡动态分配了存储单元的变量,一旦不用,就要释放。
例如动态数组,不管用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; 泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。
例如动态数组,不管用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; 泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。
全部回答
- 1楼网友:患得患失的劫
- 2021-02-23 09:50
你吧问题说的很泛啊,首先这样我们很不容易对你的问题进行准确定位。。。
按照你说的现象,可能是你在显示的过程中造成了很大的内存泄露。
请检查有没有类似CDC的GetDC()和ReleaseDC(),CBitmap的Attach和Detach(),以及LoadImage()和DeleteObject()这样的绝对配对错误,它们如果不配对会造成严重的内存泄露。
- 2楼网友:山有枢
- 2021-02-23 09:30
自动释放不可能啊,堆的内存,自己释放,就是说内存管理问题
我有个办法,给一个宏,打印出所有的new的代码,包括strdup这样的方法,然后就打印在output中了
code:
char szStrAddress[500] = {0}; \
sprintf_s(szStrAddress, sizeof(szStrAddress), "%s(%d): 内存地址:(0X%x) \n", __FILE__, __LINE__, psz); \
我的这个是通用的,还就就是重写delete和new方法,这个百度一下一大堆~~
- 3楼网友:迟山
- 2021-02-23 09:00
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();
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯