2016-08-21 27 views
0

Microsoft Visual Studio 2015 (v14.0)我有一個包含3個項目的解決方案。更改運行時庫選項對運行時鏈接的影響

其中兩個項目是DLL,另一個是可執行文件。
可執行文件在運行時加載DLL並調用它們的函數並交換參數;使用Window的LoadLibraryGetProcAddress API。

Release模式下,當我設置Runtime Library我的項目到Multi-threaded DLL一切工作正常。對於Debug模式,這是Multi-threaded Debug DLL

如果我更改爲Multi-threadedReleaseMulti-threaded DebugDebug我開始越來越調試斷言錯誤或內存訪問衝突錯誤和其他種類的錯誤。 (當我更改它時,我更改了解決方案中的所有項目。)

我需要使用Multi-threaded選項,以便可執行文件不需要目標計算機上的C++運行時庫。我該如何解決這個問題?

回答

0

這是因爲使用/MT分離實體(即DLL和可執行文件)的運行時間,每個實體具有自己的運行時間,因此它們自己的堆,試圖在一個內存中分配內存並在另一個內釋放內存將最終出錯。因爲其他模塊忘記了分配的內存。
另一方面,由於/MD所有模塊共享相同的運行時間,並且由於運行時知道在一箇中分配的內存,它將能夠在另一箇中釋放它。因爲運行時的一個實例管理整個內存。

編輯: 由於dxiv評論。

+0

你寫的東西有一些誤解。地址空間是按進程進行的,並且DLL總是與加載它們的進程共享相同的地址空間,並且與同一進程加載的其他DLL共享同一地址空間。在同一個進程中的任何其他地方,訪問分配在一個DLL函數中的內存是完全安全的。 */*不與*/MT一起工作的是在一個DLL中的代碼中分配內存('new'),然後從另一個DLL中釋放代碼('delete'),因爲使用'/ MT',每個DLL都有自己的靜態鏈接的CRT副本。看例如[這個答案](http://stackoverflow.com/a/8157934)。 – dxiv

+1

@dxiv你是對的,謝謝你的評論。我修改了答案。 –