我有一个DLL和3个使用此DLL的应用程序。 (这些应用程序不会同时运行)
在3个应用程序中,2个完美地工作但是1个应用程序在一段时间后没有从一个DLL函数得到响应(在第7个函数调用时,具体)。 此外,如果我使用Application或我的DLL的调试版本,代码可以正常工作。它仅在发布版本中停止。
在度过了2个不眠之夜后,我发现如果我将DLL的项目属性从/MD
更改为/MT
,则此应用程序可以正常运行。
我不知道为什么会发生这件事。任何人都可以为睡眠不足的程序员解释这个!
更新:
我会在市场上发布这个DLL而且我不能说用户应用程序是构建的是/MT
还是/MTD
还是其他......有什么方法可以确保它能够正常工作任何申请。
答案 0 :(得分:2)
在Windows中,EXE和DLL文件是模块。 动态编译的每个模块(/ MD)共享一个堆。 所以在动态模块中,如果一个模块调用malloc(或new) 另一个模块对对象的自由(或删除)都很好。
编译为在C运行时中静态链接的每个模块都有自己的堆。 如果一个静态模块分配对象和不同的静态或动态 模块试图释放对象,程序会因为分配而崩溃 而且免费是针对不同的堆。
答案 1 :(得分:0)
/ MD将运行时链接为动态,如果计算机已正确安装运行时,则编译为/ MT将起作用,因为运行时将包含在二进制文件中。
当你将它编译为Debug模式时,它也可以解释,在调试模式下,运行时的调试版本静态链接到二进制文件。
查看here,了解有关该主题的一些讨论。
<强>更新强> 另一个问题可能是dll是用不同的选项编译的模块,如msdn article中所述:
传递给链接器的给定调用的所有模块必须是 使用相同的运行时库编译器选项(/ MD,/ MT, / LD)。