如何在MD(d)和MT(d)工程间正确分配和释放动态内存

MD(d)和MT(d)

MD(d)和MT(d)是windows下VC开发的两个编译选项,表示程序的运行时库编译选项。

/MT是"multithread, static version" 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。

/MD是"multithread- and DLL-specific version",意思是多线程DLL版本,定义了它后,编译器把MSVCRT.lib安置到OBJ文件中,它连接到DLL的方式是静态链接,实际上工作的库是MSVCR80.DLL。

即:

静态运行时库:LIBCMT.lib

动态运行时库:MSVCRT.lib +MSVCR80.DLL

如何选择MD(d)和MT(d)

  MD(d)编译选项编译的程序因为是动态链接运行时库的,所以软件大小较小,但是有时候因为系统没有程序所需要的运行时库版本,所以必须要使用MT(d)编译,这个时候软件占用空间就相对较大。一个解决方案中的不同项目间最好使用相同的编译选项,这样的话就不会出现在静态运行时库上分配的动态内存在静态运行时库上去释放导致的崩溃等问题。

如何在不同编译选项的模块间正确分配和释放内存

如果不可避免的在工程中不同模块间同时使用了MD(d)和MT(d),而且需要在不同模块间进行动态内存的分配和释放,这时可以使用:

HeapAlloc

HeapFree

函数进行动态内存的分配和释放,因为这两个函数是在进程内存空间上分配堆内存的,所以不同模块间是共用的一块内存,就不会出现使用new和delete导致的崩溃问题。

参考文献:

http://blog.csdn.net/nodeathphoenix/article/details/7550546

时间: 2024-10-27 01:46:20

如何在MD(d)和MT(d)工程间正确分配和释放动态内存的相关文章

Windows编程vs编译器 MD(d)、MT(d)编译选项的区别

原文查看 Windows编程vs编译器 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 多线程.Re

求救:如何在Eclipse IDE for C/C++ Developers中正确编译GTK程序?

出现错误信息如下,请问大牛该如何解决? 00:52:56 **** Incremental Build of configuration Debug for project Again **** make all  Building file: ../why.c Invoking: GCC C Compiler gcc "../why.c" -I/usr/include/glib-2.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-

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 M

md /mdd /ml /mt/mtd

http://www.cnblogs.com/eddyshn/archive/2009/11/23/1608823.html VC编译选项 多线程(/MT)多线程调试(/MTd)多线程 DLL (/MD)多线程调试 DLL (/MDd)C 运行时库                        库文件Single thread(static link) ML            libc.libDebug single thread(static link) MLd        libcd.

如何在Flash Builder里新建ActionScript工程

新建ActionScript工程 1. File > New > ActionScript Project 2. 按照提示完成工程的创建 使程序直接在Flash Player中运行 1. 在工程上点右键,选Properties > ActionScript Compiler 2. 去掉Generate HTML wrapper file前面的勾 如何Rebuild工程 1. 在菜单条上选择,Project > Clean...

Eclipse中的Web项目自动部署到Tomcat以及如何在Eclipse中使用My Eclipse工程

我是一个新手学习Java,servlet和Jsp. 痛苦的是我时候一个.net程序员,习惯了微软的VS IDE一切都是封装好的.傻瓜式的使用, 不需要关心内部实现. 悲催的是我看到资料都是My Eclipse, 但我下载使用的环境是Eclipse.这就有两个问题要解决. 一个是如何把My Eclipse的东西同步到Eclipse上, 另外一个是版本控制问题.我的环境我觉得比较奇葩(Tomca6.0.45+J2ee1.8.25). 在这个过程中遇到的问题较多,下面就找一个先突破吧. 如何部署Ser

Maven install 的作用 及 Maven是如何维护工程间依赖的

1.当Maven工程的代码发生更改后,是否需要先install该工程再放在jetty插件上运行即jetty:run前是否需要install? 答:不需要 2.那么,install命令应该在何时执行呢? 答:当该工程被其他工程依赖时,修改该项目代码,必须install才能让其他工程依赖最新的该工程.如存在工程common,当common代码发生变化时,必须执行install,其他依赖它的工程,如settle等才能依赖到最新的common,依赖的common才是最新代码. 为什么? 因为执行inst

解决Eclipse中Java工程间循环引用而报错的问题

如果myeclipse  报如下错误 A cycle was detected in the build path of project 如果我们的项目包含多个工程(project),而它们之间又是循环引用的关系,那么Eclipse在编译时会抛出如下一个错误信息: "A cycle was detected in the build path of project: XXX" 解决方法非常简单: Eclipse Menu -> Window -> Preferences..

JAVA中,不同工程间的方法调用

可以调用, 用配置构建路径的方法:点选工程1, 点击右键, 选择 Build Path(构建路径) - > Configure Build Path...(配置构建路径...)然后在弹出的窗口中选择Project(项目)点击右侧的Add(添加), 把工程2点选上, 一路OK(确定), 就可以调用工程2中的类了. 提示的是:"The import ... is never used"("从未使用导入 ... ") 吗?应该是警告吧, 因为你虽然引这个包或者类了,