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

时间:2012-06-18 20:34:12

标签: c++ windows visual-studio-2005 msvcrt crt

我正在构建一个应用程序,其输出是库,最终被另一个客户端应用程序使用。我最近发现我使用/MDd在调试模式下构建应用程序以生成代码(调试CRT库),并且即使在调试模式下使用/MD,客户端应用程序也是针对发行版CRT构建的。因此,这可能会导致一些内存堆损坏错误。为了确认,我在发布模式下对所有内容进行了测试,看起来效果很好。

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

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

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

1 个答案:

答案 0 :(得分:1)

我的猜测是你违反了一个定义规则,因为检查了迭代器。请参阅: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存在错误,这些错误未正确实现并且我认为已修复以后的版本。