MFCButton Memory leak(内存泄露和多字节内存溢出导致不能用的问题)
发布日期:2021-06-30 18:20:48 浏览次数:2 分类:技术文章

本文共 2242 字,大约阅读时间需要 7 分钟。

文章来自:

1.无法显示右边箭头的问题

无论怎么折腾都没显示不出来,微软给的示例又能显示,度娘和谷歌也都不知道,经过不断地探索总算找到解决办法了:在rc2文件中加上下面的内容即可

#ifndef _AFXDLL

#include "afxribbon.rc"      // Ribbon and control bars
#endif

当然,要想按钮有XP的风格,还需要在App类的InitInstance中加上

CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

然而这样在关闭程序时会发现有内存泄漏,输出窗口中出现如下内容:

Init CriticalSection spin count CDLPShareMemConfig::Close()CDLPShareMemConfig::Close()TSWebDownLoadProtect.dll is Load failedTSWebMon.dat is Load failedDetected memory leaks!

Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxvisualmanagerwindows.cpp(35) : {487} client block at 0x001C9318, subtype c0, 376 bytes long.
a CMFCVisualManagerWindows object at $001C9318, 376 bytes long
Object dump complete.

显然,这是由于RUNTIME_CLASS(CMFCVisualManagerWindows)动态创建了一个CMFCVisualManagerWindows的实例没有释放,不知道CMFCVisualManager在搞什么,在吃SHI吗,还需要我们手动释放,既然它不作为,那我们只有自己干了,在ExitInstance中加上CMFCVisualManagerWindows::DestroyInstance();就好了

 

2. 多字节编码下堆破坏

如果你建的项目是使用的Unicode编码,那么在Debug模式下没有问题,Release模式下同样会出现堆破坏的错误,程序根本没法启动!如果是多字节编码,那么对不起,任何模式都不行,不知道MFC怎么搞的!

没办法,总得知道原因出在哪里吧,找到MFC的源码(源码怎么找相信大家都知道,就在VS安装目录下\VC\atlmfc\src\mfc下面,查找包含CMFCMenuButton字符串的文件,怎么搜索不用我说了吧,在Win7下改一下搜索选项就可以了),在OnDraw里面打断点,发现问题出在CMFCButton::OnDraw那一行,继续调CMFCButton::OnDraw,发现问题出在GetWindowText,用一个大一点的缓冲区来存获得的文本吧,发现文本后面被填入了"\0 MFCMenuButton",乖乖,多出这么长一截,堆能不被破坏吗?

解决办法有两个:

(1)重载CMFCMenuButton,自己实现OnDraw(可以将CMFCButton和CMFCMenuButton的OnDraw合并起来),在GetWindowText那里自己分配一个大一点的缓冲区就行了;这种办法太笨拙了,不推荐。

(2)不写任何代码,直接将Button控件拖入到对话框中,添加变量时变量类型改成CMFCMenuButton就可以了,只不过需要自己设置按钮的一些属性。firecat注:但是会引发新的问题,即多文档界面时,当按钮所在的父窗口失去焦点,按钮按下会无法响应,多按两次才会响应,囧。

 

好了,就这么多,如果谁有更好的解决办法请指教!

http://blog.csdn.net/polytechnic/article/details/5698397

本来应该不会有这篇四的,但因为发现了 bug,所以要 patch 一下。

之前那个程序,退出的时候提示内存泄漏。

Detected memory leaks!

Dumping objects ->
f:/dd/vctools/vc7libs/ship/atlmfc/src/mfc/afxvisualmanagerwindows.cpp(35) : {664} client block at 0x02BE30D8, subtype c0, 376 bytes long.
a CMFCVisualManagerWindows object at $02BE30D8, 376 bytes long
Object dump complete.

这是 CMFCVisualManagerWindows 的问题了。

解决方法:

把:      CMFCVisualManager ::SetDefaultManager (RUNTIME_CLASS (CMFCVisualManagerWindows ));

替换成:CMFCVisualManager ::SetDefaultManager (RUNTIME_CLASS (CMFCVisualManagerWindows7 ));

至于原因嘛,暂时还不知道。难道这是 MFC 的 bug ?

转载地址:https://libaineu2004.blog.csdn.net/article/details/91062607 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:好工具推荐系列:Qt多国语言翻译国产软件digital translate
下一篇:写了个VC++ MFC小工具,一键整理Resource.h文件,重新排序并去重复ID(★firecat推荐★)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月12日 22时46分23秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章