/MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
来源:互联网 发布:吐槽 程序员男友 编辑:程序博客网 时间:2024/04/28 06:17
原文链接
2012-2-3
烛秋
一、MD(d)、MT(d)编译选项的区别
1、编译选项的位置
以VS2005为例,这样子打开:
1) 打开项目的Property Pages对话框
2) 点击左侧C/C++节
3) 点击Code Generation节
4) 右侧第六行Runtime Library项目
2、各个设置选项代表的含义
编译选项
包含
静态链接的lib
说明
/MD
_MT、_DLL
MSVCRT.lib
多线程、Release、DLL版本的运行时库
/MDd
_DEBUG、_MT、_DLL
MSVCRTD.lib
多线程、Debug、DLL版本的运行时库
/MT
_MT
LIBCMT.lib
多线程、Release版本的运行时库
/MTd
_DEBUG、_MT
LIBCMTD.lib
多线程、Debug版本的运行时库
简单的说:
(1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。
(2)/MT,表示运行时库由程序集成。
二、/MD、/MT的选择
1、为什么选择/MD,不选/MT?
(1)程序就不需要静态链接运行时库,可以减小软件的大小;
(2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题。
2、为什么选择/MT,不选择/MD?
(1)有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上。
3、多个模块,必须选择相同的运行时库。
三、选择/MT需要解决的堆空间释放问题
不同的模块各自有一份C运行时库代码、或者根本没有C运行时库,导致了各个模块会有各自的堆。如果在A堆中申请空间,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。
附件(下载地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代码,以STL的string为例,通过修改编译选项验证了这个问题。(string在赋值的时候需要释放掉原来的空间,然后再申请新的空间存储新的内容。)
四、参考资料
1、微软关于MT、MD等的详细介绍
http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
2、不要出现A模块申请,B模块释放的情况
http://www.cnblogs.com/minggoddess/archive/2010/12/15/1907179.html
3、运行时库有哪些版本
http://www.cppblog.com/MichaelLiu/articles/10607.html
4、CSDN上关于堆空间释放的讨论
http://topic.csdn.net/t/20010112/09/57983.html
http://topic.csdn.net/t/20031009/17/2338051.html
http://topic.csdn.net/u/20090502/00/bf1602e3-ddf5-49b0-af81-8a23383f9ddc.html
http://blog.csdn.net/blz_wowar/article/details/2176536
5、不同模块不同的堆
http://www.cnblogs.com/WengYB/archive/2011/08/18/2144727.html
附录:
测试代码下载地址
http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- 不同运行时库/MT、/MD等编译选项,以及可能引起在不同堆中申请、释放内存的问题
- vs中编译选项MD、MDd、MT的区别
- 关于在dll中申请内存,外部释放的问题
- 关于在dll中申请内存,外部释放的问题
- 关于在dll中申请内存,外部释放的问题
- 关于在dll中申请内存,外部释放的问题
- Windows编程 MD(d)、MT(d)编译选项的区别
- ubuntu 10.04下nfs挂载2440
- 代码审查最佳实践
- O(n)回文子串算法
- compareTo&compare 接口 compareable & comparator
- uibuttn UIButton
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- .NET中Application,Session,Cookie,ViewState,Cache,Hidden 缓存机制
- 39个超棒的免费高清专业纹理收藏集
- 更改子窗体的颜色
- 【DP】 hdu3001 Travelling
- Android ApiDemo学习(五)Animation—— 1 Bouncing Balls
- java compare 接口
- 电脑真的有那么神奇吗?
- SQL解决MODIFY FILE 失败。文件 '*******'不存在