以VS2005為例,這樣子打開:
1) 打開項目的Property Pages對話框
2) 點擊左側C/C++節
3) 點擊Code Generation節
4) 右側第六行Runtime Library項目
編譯選項
包含
靜態鏈接的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,表示運行時庫由程序集成。
(1)程序就不需要靜態鏈接運行時庫,可以減小軟件的大小;
(2)所有的模塊都采用/MD,使用的是同一個堆,不存在A堆申請,B堆釋放的問題。
(1)有些系統可能沒有程序所需要版本的運行時庫,程序必須把運行時庫靜態鏈接上。
不同的模塊各自有一份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