文档章节

内存泄露:a CDynLinkLibrary object at...的解决

郭廷钧
 郭廷钧
发布于 2011/01/29 18:48
字数 719
阅读 472
收藏 1

这两天在设计一个项目,独立了几个DLL模块。昨天勉强把前段工作做完了,需要的DLL也都挂进了EXE文件之中,暗自高兴了一把。不过晚上在看的时候,发现VS2005输出窗口提示有内存泄露:

a CDynLinkLibrary object at...

心里总觉得不爽 L

 

今天去Google搜索了一下,第一篇是:当您使用多个MFCDLL 报告内存泄漏

http://support.microsoft.com/kb/167929/zh-cn

由于是“注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。”所以没有怎么仔细看。

 

后来通过注释代码发现,原因可能是因为一个DLL内部使用另一个DLL中的导出类造成的。于是将这两个DLL合并到一个DLL中,再链接到EXE中测试,果然没了J

 

但是我又不想将这两个DLL合并到一起,因为另一个DLL是“通用”的。我在想,这倒底是什么原因呢?一生气,算了,直接搞个Win32 DLL,也不使用什么MFC DLL

建立好Win32 DLL之后,拷贝以前DLL中的类到项目,加进去编译。编译器却提示说:什么MFC工程需要MFC DLL支持。再一想,原来是因为以前的MFC DLL向导会默认包含stdafx.h。纯Win32 DLL不需要这个。突然之间,又想到了一个问题:那篇自动翻译的提到了什么UNICODEANSI

 

原文如下:

 ANSI (MFC40d.DLL)  MFC 版本生成 MFC 应用程序调用 MFC USRDLL, 它与 UNICODE (MFC40Ud.DLL)  MFC 版本生成。 MFC 版本使用相同 C 运行时库 (CRT) DLL, MSVCR40d.DLL 由于 MFC USRDLLs 是框 " 黑色 - ", 应从 ANSI MFC 应用程序调用 UNICODE MFC USRDLL 没有问题。

但是以来 (MFC40ud.DLL) UNICODE  ANSI (MFC40d.DLL) MFC DLL 都使用同一 CRTDLL, MFC USRDLL 中分配所有对象上报告假内存泄漏。 这是因为 MFC 依靠 CRTDLL 来分配和跟踪所有内存。 它并不分开来自不同版本的 MFC 内存分配。  MFC DLL 之一卸载它调用 CRT 进行内存转储假定所有处于堆是内存泄漏。 但是此假定是错误因为有两多份 MFC 内存中。

 

这有问题么?立马打开所有的DLL项目,

看到突显的这块了么,我的项目中有的DLL使用的是Unicode字符集,有的使用的是多字节字符集。然后将所有的DLL使用多字节字符集进行编译,生成EXE。一看,没了。看来,项目中使用的DLL字符集要保持一致,怪不得有些库会编译出好多版本来,然后在它的包含文件,根据预处理的定义加载“正确”的DLL

本文转载自:http://blog.sina.com.cn/s/blog_4bf793ad0100o0st.html

郭廷钧
粉丝 3
博文 11
码字总数 0
作品 0
郑州
程序员
私信 提问
内存泄漏详细分析

首先,什么是内存泄露?经常听人谈起内存泄露,但要问什么是内存泄露,没几个说得清楚。内存泄露是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存...

激情的狼王丶21
2017/11/09
0
0
out就可以理解为System类的静态成员变量引用了PrintStream类的对象

面试题是实验室师兄面试提供的。两道题 题1:Java中System.out.print()如何理解? 查阅API文档,我们可以知道:System是Java中的一个类,而out是System类的成员 。 out属于java.io.PrintStre...

变小火
2018/06/29
0
0
java内存泄露的原因、分析、解决

一、Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在...

洋哥6
2016/12/23
58
0
performSelector延时调用导致的内存泄露

关于objective-c的内存管理,我们都知道一个原则就是“谁创建,谁释放”,换句话说,不是我们创建的,就不用我们去释放。但是实际上objective-c的内存管理远远没那么简单,我的情况是这样的:...

啊子同
2016/07/20
11
0
XCode Static Analysis 静态分析工具分析代码

Clang静态分析和Instruments来剖析代码有一些不同,Clang更致力于在编译的过程中通过自身的一套判断机制来找出代码中潜在的隐患。   在XCode 3.2之后的版本里,Clang已经被集成进来,Stati...

奋斗的青春年华
2016/09/09
126
0

没有更多内容

加载失败,请刷新页面

加载更多

DevOps是如何实现效率的提升?

随着企业业务对软件系统日益依赖,IT管理与研发模式也随之对“敏态”模式产生了需求,也就是今天时常提起的DevOps。提升效率,是DevOps实践的核心内容之一。就让我们来一起从软件生命周期的业...

嘉为科技
24分钟前
2
0
总结:linux目录之proc

我们系统大部分的基础数据采集,其实就是读取proc目录下的文件,并解析获取数据的过程。 1、如cpu利用率:直接cat /proc/cpuinfo命令,然后获取输出内容,并解析里面的数据,如cpu核数等; ...

浮躁的码农
26分钟前
2
0
比原Bapp红包应用

喜迎国庆期间,比原链在自己的移动端钱包Bycoin(下载地址)和google插件钱byone中推出了红包应用,在国庆期间深受大家好评。 那我们今天就来大概介绍一下比原红包,以及基于比原链开发dapp应用...

比原链Bytom
27分钟前
2
0
Linux中没有rc.local文件的解决方法

Linux中没有rc.local文件的解决方法是什么呢?这应该是很多工程师比较头疼的问题,下面就给大家例举几个解决办法。 比较新的Linux发行版已经没有rc.local文件了。因为已经将其服务化了。 解决...

xiangyunyan
27分钟前
2
0
数据中台在阿里巴巴集团内部的实践情况

作者:品鉴 数据中台门在阿里巴巴集团干什么的,由哪个部门掌管?数据中台在阿里巴巴的主要作用是什么呢?外面吹嘘这么神秘的数据中台在阿里实践的如何呢?今天小编正好要采访数据技术及产品...

阿里云官方博客
27分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部