c++ -/MTd 会触发断点但/MDd 不会

标签 c++ visual-studio-2010 visual-c++

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

Windows has triggered a breakpoint in application.exe.

This may be due to a corruption of the heap, which indicates a bug in application.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while application.exe has focus.

The output window may have more diagnostic information.

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

最佳答案

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

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

关于c++ -/MTd 会触发断点但/MDd 不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16696923/

相关文章:

c# - C# .NET 控制台应用程序使用的控制台字体和布局

python - 链接到 VS2010 c++ 中特定位置的 dll

c++ - Visual C++ 函数突然慢了 170 毫秒(长了 4 倍)

C++ 和 Windows - NtCreateThreadEx 函数的 DLL 注入(inject)不起作用

c++ - FLD浮点指令加载常数

c++ - 如何在Linux中将静态库链接到makefile

c++ - std::make_shared 在使用来自位域的参数构造时无法编译

c++ - 裸机 C++ 中的 std::streambuf 实例化

c# - C# 代码插入错误时回滚

c++ - 如何解决生成运算符 = 赋值和复制构造函数的 VC++ 2012 错误?