gpt4 book ai didi

c++ - 在 MS VC++ 2005 中调试堆损坏错误

转载 作者:行者123 更新时间:2023-11-28 08:02:23 25 4
gpt4 key购买 nike

我正在构建一个应用程序,其输出是最终被另一个客户端应用程序使用的库。我最近发现我正在使用 /MDd 以 Debug模式构建我的应用程序以生成代码(调试 CRT 库),并且客户端应用程序是针对发布 CRT 构建的,即使使用 /MD在 Debug模式下。因此,这可能会导致一些内存堆损坏错误。为了确认这一点,我在 Release模式下测试了所有内容,它似乎工作正常。

为了解决这个问题,我也尝试做一个release with debug info 构建(/MD)并将客户端应用程序的调试构建链接到这个 relwithdebinfo 构建,但现在我在测试我的示例时在客户端应用程序中看到一些奇怪的行为。准确地说,当我分配一个字符串时,说使用:

std::string client_str = some_namespace_in_my_library::class_name::string_name,

我发现 client_str 没有分配,而是保持为空。当一切都在调试中构建时(当存在混合和匹配时),这工作正常。任何想法为什么会这样?上面引用的命名空间中的字符串是类 class_name 的静态公共(public)成员。所有这些都在 MS VC++ 2005 上。非常感谢任何建议/帮助。谢谢!

最佳答案

我的猜测是您因为检查迭代器而违反了单一定义规则。请参阅:http://msdn.microsoft.com/en-us/library/aa985896(v=vs.80).aspx

问题是,就像上面的 Bo 已经写的那样,STL 中使用的结构和类在调试和发布版本中的大小不同,并且在使用和不使用检查迭代器时问题更大。

另一个原因可能是,已检查迭代器的默认值随发布版本的 visual studio 版本而改变。虽然它在 vs2005 和 vs2008 中默认打开,但在 2010+ 中关闭(检查所有依赖库及其构建方式!)

这里最重要的规则是:确保每个编译单元使用完全相同的设置,包括 _SECURE_SCL_HAS_ITERATOR_DEBUGGING

我还记得一件事,但现在找不到链接:尽管带有和不带检查迭代器的调试构建本应兼容,但 vs2005 存在错误,未正确实现,我认为已修复以后的版本。

关于c++ - 在 MS VC++ 2005 中调试堆损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11090622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com