1

我有一个关于多线程调试 DLL (/MDd) 和多线程调试 (/MTd) 设置的问题。它们之间的区别很明显:一个是使用动态库,另一个是使用静态库。当我使用 /MDd 编译我的程序时,一切都进行得很好。但是,当我将设置更改为 /MTd 并运行程序时,Visual Studio 将在程序中触发断点并弹出消息框。消息如下:

Windows 在 application.exe 中触发了一个断点。

这可能是由于堆损坏,这表明 application.exe 或其已加载的任何 DLL 中存在错误。

这也可能是由于用户在 application.exe 获得焦点时按 F12。

输出窗口可能有更多诊断信息。

我想知道在这种情况下我接下来能做什么。谢谢!

4

2 回答 2

2

您的应用程序中包含的其他一些库可能是针对 DLL 运行时库编译的。如果是这样,那么当您尝试将可执行文件与静态运行时库链接时,您最终会得到两个副本:一个是静态的,一个是动态的。根据内存分配模式,这可能会导致库的一个实例具有关于堆的不完整信息。由于库的调试版本尝试检测堆损坏,您会看到错误。(请注意,对于发布版本,您可能仍然会遇到错误,只是不会收到通知。)

在决定链接静态或动态运行时库时,通常需要全有或全无。而且,如果您包含标准操作系统以外的 DLL,您几乎肯定需要动态运行时,以便进程中的所有内容都使用相同的实例。

于 2013-05-22T16:49:09.533 回答
1

非常仔细的查看了代码后,发现了另外一种情况,也可以触发同样的问题,就是内存位于一个dll中,但是在另一个dll中释放。有关此主题的更多信息,请参阅跨 dll 边界的内存分配和解除分配

于 2013-05-23T16:18:39.060 回答