我用MFC编写了一个程序,资源释放的问题
自己编写的程序,但是在使用一段时间之后任务管理器中会显示他使用了很大的内存,但是在最小化还原之后会释放很多内存,我想知道怎样自动释放这些内存。帮我解决问题的可继续加分如果...
自己编写的程序,但是在使用一段时间之后任务管理器中会显示他使用了很大的内存,但是在最小化 还原之后会释放很多内存,我想知道怎样自动释放这些内存。
帮我解决问题的可继续加分 如果想碰碰运气就算了,不能解决问题我是不会给分的
1内存泄漏的问题我基本上都考虑了,基本上没有泄漏的问题,一般我都释放掉了,也不会重复的去NEW一些东西,其实我就是想知道怎样才能实现系统的最小化最大化的操作
2还有就是我由于是自己美化的页面,但是工作一段时间后图像会花掉,有没有人能提供一些自己美化加入背景图的代码。
3一楼的太搞了,一个工程少说也有上万行代码,不好发啊,呵呵 展开
帮我解决问题的可继续加分 如果想碰碰运气就算了,不能解决问题我是不会给分的
1内存泄漏的问题我基本上都考虑了,基本上没有泄漏的问题,一般我都释放掉了,也不会重复的去NEW一些东西,其实我就是想知道怎样才能实现系统的最小化最大化的操作
2还有就是我由于是自己美化的页面,但是工作一段时间后图像会花掉,有没有人能提供一些自己美化加入背景图的代码。
3一楼的太搞了,一个工程少说也有上万行代码,不好发啊,呵呵 展开
4个回答
展开全部
凡动态分配了存储单元的变量,一旦不用,就要释放。
例如动态数组,不管用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; 泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。
展开全部
自动释放不可能啊,堆的内存,自己释放,就是说内存管理问题
我有个办法,给一个宏,打印出所有的new的代码,包括strdup这样的方法,然后就打印在output中了
code:
char szStrAddress[500] = {0}; \
sprintf_s(szStrAddress, sizeof(szStrAddress), "%s(%d): 内存地址:(0X%x) \n", __FILE__, __LINE__, psz); \
我的这个是通用的,还就就是重写delete和new方法,这个百度一下一大堆~~
我有个办法,给一个宏,打印出所有的new的代码,包括strdup这样的方法,然后就打印在output中了
code:
char szStrAddress[500] = {0}; \
sprintf_s(szStrAddress, sizeof(szStrAddress), "%s(%d): 内存地址:(0X%x) \n", __FILE__, __LINE__, psz); \
我的这个是通用的,还就就是重写delete和new方法,这个百度一下一大堆~~
参考资料: 原创~~希望可以帮到
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你吧问题说的很泛啊,首先这样我们很不容易对你的问题进行准确定位。。。
按照你说的现象,可能是你在显示的过程中造成了很大的内存泄露。
请检查有没有类似CDC的GetDC()和ReleaseDC(),CBitmap的Attach和Detach(),以及LoadImage()和DeleteObject()这样的绝对配对错误,它们如果不配对会造成严重的内存泄露。
按照你说的现象,可能是你在显示的过程中造成了很大的内存泄露。
请检查有没有类似CDC的GetDC()和ReleaseDC(),CBitmap的Attach和Detach(),以及LoadImage()和DeleteObject()这样的绝对配对错误,它们如果不配对会造成严重的内存泄露。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
发代码来瞧瞧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询