http://m.blog.csdn.net/blog/haoekin/8851219

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就可以了,只不过需要自己设置按钮的一些属性。

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

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 ?

MFCButton Memory leak(内存泄露问题)的更多相关文章

  1. DTrace memory leak 内存泄露

    http://blog.sina.com.cn/s/blog_538040b70100eecn.html   如下程序用于跟踪,在分配和回收都会触发探针 #!/usr/sbin/dtrace -s p ...

  2. Java 基础 - 内存泄露Memory leak & 内存溢出Out of memory

    内存泄露 & 内存溢出 关系 https://www.cnblogs.com/panxuejun/p/5883044.html 内存泄露的6种情况: https://blog.csdn.net ...

  3. Diagnosing out of memory errors and memory leaks 内存泄露实例 C Java JavaScript 内存泄露

    小结: 1. 数据库连接池. JDBC语句和结果对象必须显式地关闭. 2. 电梯到目标楼层后地址是否被释放 When a button is pressed: Get some memory, whi ...

  4. 转: 利用 DEBUG_NEW 来追溯 Memory leak 内存泄漏

    参考: https://msdn.microsoft.com/en-us/library/tz7sxz99.aspx http://www.cnblogs.com/taoxu0903/archive/ ...

  5. Objective-C Memory Management 内存管理 2

    Objective-C Memory Management 内存管理  2  2.1 The Rules of Cocoa Memory Management 内存管理规则 (1)When you c ...

  6. java 基础知识学习 内存泄露(memory leak) VS 内存溢出(out of memory)以及内存管理

    内存泄露(memory leak) VS 内存溢出(out of memory) 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory ...

  7. Linux C/C++ Memory Leak Detection Tool

    目录 . 内存使用情况分析 . 内存泄漏(memory leak) . Valgrind使用 1. 内存使用情况分析 0x1: 系统总内存的分析 可以从proc目录下的meminfo文件了解到当前系统 ...

  8. java内存泄露与内存溢出

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory: 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空 ...

  9. 警告: The web application [ROOT] appears to have started a thread named [Thread-48] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:

    1. 问题描述 tomcat跑web项目(其中依赖java项目) 出现大量上述警告 项目起不来 关键字 memory leak 内存泄漏 2. 解决方案 难道是程序写的有问题? 最终 将tomcat ...

随机推荐

  1. Hadoop 如何查看是否32位

    1.从哪些地方可以识别hadoop是32位还是64位?2.hadoop本地库在什么位置? hadoop在安装的时候,我们需要知道hadoop版本是32位还是64位. hadoop官网本来提供的都是32 ...

  2. 重新安装配置ubuntu的引导菜单

     查看分区挂在情况,找到ubuntu所在分区(boot)$sudo fdisk   -l   卸载isodevice镜像设备所在盘分区(boot) $sudo  umount  -l  /isodev ...

  3. CentOS 6.5设置静态IP教程 并且可以ping通

    CentOS6.5掉电或重启,它的IP会被DHCP重新分配,如果要远程控制这台电脑,不得不去打开显示器去查看它的新IP,这样太麻烦了.于是需要将这台电脑的IP设置成静态的. 网上常规的设置静态ip的方 ...

  4. bootstrap-13

    bootstrap框架中制作导航条主要通过“.nav”样式.默认的.nav样式不提供默认的导航方式,必须附加另外一个样式才会有效,比如.nav-tabs,.nav-pill之类. 导航(标签型导航): ...

  5. position置顶或某固定位置 兼容ie6ie7

    用absolute来模拟fixed效果: /*相当于正常的position:fixed;top:0 */.sl_fixed_top{bottom:auto;top:0;_bottom:auto;_to ...

  6. CI框架 CodeIgniter 伪静态 htaccess设置和Nginx伪静态方法

    众所周知,LAMP代表Linux下Apache.MySQL.PHP这种网站服务器架构:而LNMP指的是Linux下Nginx.MySQL.PHP这种网站服务器架构.LNMP一键安装包可以从网上下载使用 ...

  7. 安全快速修改Mysql数据库名的5种方法

    1. RENAME DATABASE db_name TO new_db_name这个..这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了.据说有可能丢失数据.还是不要用的好.详 ...

  8. PHP 输出图像 imagegif 、imagejpeg 与 imagepng 函数

    imagegif().imagejpeg().imagepng() 和 imagewbmp() 函数分别允许以 GIF.JPEG.PNG 和 WBMP 格式将图像输出到浏览器或文件. PHP 输出图像 ...

  9. ADF_Starting系列9_使用EJB/JPA/JSF通过ADF构建Web应用程序之测试J2EE Container

    2013-05-01 Created By BaoXinjian

  10. DOMContentLoaded和jquery的ready和window.onload的顺序

    document.addEventListener('DOMContentLoaded', function(){ alert(1) }); window.onload=function(){ ale ...