【问题标题】:Debugging heap corruption error in MS VC++ 2005调试 MS VC++ 2005 中的堆损坏错误
【发布时间】:2012-06-18 20:34:12
【问题描述】:

我正在构建一个应用程序,其输出是最终被另一个客户端应用程序使用的库。我最近发现我正在使用/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 上。非常感谢任何建议/帮助。谢谢!

【问题讨论】:

  • 谢谢@Persson:不,它不是重复的(我也发布了那个)。阅读问题/帖子。我在这里尝试不同的东西。相关,是的..但不是重复的。我可以将其作为编辑(或最近的操作)整合到原始问题中。
  • 混合调试和发布代码时,任何事情都可能发生。我认为这是您在另一个问题中遇到的相同问题的另一个实例。建议就是不要尝试这个。对不起!
  • 你能澄清一下吗?假设您有一个应用程序,并且您正在链接一个您不需要调试(并且通常不能)的第三方库。为什么要链接这些库的调试版本?同样,许多应用程序针对发布 CRT 构建其调试版本。因此,鉴于此,您究竟在建议什么?
  • 我不确定 VS2005,但我知道 VS2010 在调试模式下向容器和迭代器(包括std::string)添加了额外的调试帮助器字段。这意味着对象的调试和发布版本具有不同的大小,并且像赋值之类的东西肯定行不通。我怀疑你在这里遇到了类似的事情。

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


【解决方案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 也存在未正确实现的错误,我认为已修复以后的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2023-04-06
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多