我有一个关于多线程调试DLL (/MDd)和多线程调试(/MTd)设置的问题.它们之间的区别是显而易见的:一种是使用动态库,另一种是使用静态库。当我使用/MDd编译我的程序时,一切都进行得很顺利。但是,当我将设置更改为/MTd并运行该程序时,Visual将使用弹出消息框在程序中触发一个断点。该信息如下:
Windows在application.exe中触发了一个断点。 这可能是由于堆损坏所致,它表示application.exe或其加载的任何DLL中存在错误。 这也可能是由于用户按下F12,而application.exe有焦点。 输出窗口可能有更多的诊断信息。
我想知道在这种情况下我下一步能做什么。谢谢!
发布于 2013-05-22 16:49:09
您在应用程序中包含的其他库可能是针对DLL运行时库编译的。如果是这样,那么当您尝试将您的可执行文件链接到静态运行时库时,您将得到两个副本:一个是静态的,另一个是动态的。根据内存分配模式,这可能导致库的一个实例具有关于堆的不完整信息。由于库的调试版本试图检测堆损坏,您将看到错误。(请注意,在发布版本中,您可能仍然有一个错误,只是不会收到通知。)
在决定与静态或动态运行时库进行链接时,通常需要进行全部或无操作。而且,如果您包含的DLL不是标准OS的DLL,那么您几乎肯定需要动态运行时,以便进程中的所有内容都使用相同的实例。
发布于 2013-05-23 16:18:39
在非常仔细地检查代码之后,我发现了另一种也可能触发相同问题的情况,即内存位于一个dll中,但它被释放在另一个dll中。有关此主题的更多信息,请参阅Memory allocation and deallocation across dll boundaries
https://stackoverflow.com/questions/16696923
复制相似问题