MFCButton Memory leak(内存泄露问题)
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(内存泄露问题)的更多相关文章
- DTrace memory leak 内存泄露
http://blog.sina.com.cn/s/blog_538040b70100eecn.html 如下程序用于跟踪,在分配和回收都会触发探针 #!/usr/sbin/dtrace -s p ...
- Java 基础 - 内存泄露Memory leak & 内存溢出Out of memory
内存泄露 & 内存溢出 关系 https://www.cnblogs.com/panxuejun/p/5883044.html 内存泄露的6种情况: https://blog.csdn.net ...
- Diagnosing out of memory errors and memory leaks 内存泄露实例 C Java JavaScript 内存泄露
小结: 1. 数据库连接池. JDBC语句和结果对象必须显式地关闭. 2. 电梯到目标楼层后地址是否被释放 When a button is pressed: Get some memory, whi ...
- 转: 利用 DEBUG_NEW 来追溯 Memory leak 内存泄漏
参考: https://msdn.microsoft.com/en-us/library/tz7sxz99.aspx http://www.cnblogs.com/taoxu0903/archive/ ...
- Objective-C Memory Management 内存管理 2
Objective-C Memory Management 内存管理 2 2.1 The Rules of Cocoa Memory Management 内存管理规则 (1)When you c ...
- java 基础知识学习 内存泄露(memory leak) VS 内存溢出(out of memory)以及内存管理
内存泄露(memory leak) VS 内存溢出(out of memory) 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory ...
- Linux C/C++ Memory Leak Detection Tool
目录 . 内存使用情况分析 . 内存泄漏(memory leak) . Valgrind使用 1. 内存使用情况分析 0x1: 系统总内存的分析 可以从proc目录下的meminfo文件了解到当前系统 ...
- java内存泄露与内存溢出
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory: 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空 ...
- 警告: 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 ...
随机推荐
- ASP.NET Cookie存值问题
想必 用Cookie存值已经是很普遍的了,我也是刚学习了一点皮毛,现在就记下一点知识,便于日后翻阅. 1.C#代码存取Cookie值 //用Request获取到客户端Cookie 判断是否为空 if ...
- 后台返回JSON关于日期的格式化
JSONObject 可以将java对象转换成json格式,用于处理ajax请求或者做app是与前台的交互. 但是Date类型的也会做转换,很多时候我们是不想将日期的年月日分别转换成json的.可以通 ...
- python模块之time
Python中的时间模块. 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素. 2.UTC(Coordinated U ...
- 使用Template控制Editor显示方式
@Html.EditorFor可以由Template决定显示 虽然都是EditorFor,页面上显示却不同,ReleaseDate是一个Jquery DatePicker: 怎么实现的呢?就是Temp ...
- Linux线程-创建
Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...
- vim使用过程
首先推荐几篇文章先: 用Vim编程——配置与技巧 有时候需要设置映射键,此时可以在.vimrc中配置一些项就可以轻松映射了. 以下是几个映射模式: map : 正常模式,可视化模式和运算符模式可用 n ...
- Java-->Gson序列化及反序列化
--> 首先导入jar包,并添加到Build Path --> 需要User类:有属性.构造方法和setter.getter方法. --> Test 测试类: package com ...
- struts2 ajax的一种实现方式
/** * ajax请求,通过省份id获取学习中心 */ public void getSitesByPid() { HttpServletResponse response = ServletAct ...
- 关于java 中文乱码问题 自己的一点解决方案
早上做导出的时候,url拼接参数中文出现了乱码.查了半天.终于中午搞定了. 在web.xml中加了转码过滤器,tomcat的server.xml中也加入URIEncoding="UTF-8& ...
- 使用APC缓存PHP opcode
1. 关于版本 我的php版本是5.3.10 最开始使用 APC-3.1.8 编译成功,但是 php -m 得不到扩展 , 换成 APC-3.1.9 后解决. 2. 关于配置 apc.cac ...