在 vs2008 SP1 中禁用检查迭代器时出现问题 (_HAS_ITERATOR_DEBUGGING=0)

Posted

技术标签:

【中文标题】在 vs2008 SP1 中禁用检查迭代器时出现问题 (_HAS_ITERATOR_DEBUGGING=0)【英文标题】:Problem when disabling checked iterators in vs2008 SP1 (_HAS_ITERATOR_DEBUGGING=0) 【发布时间】:2010-10-21 16:46:17 【问题描述】:

当我尝试禁用已检查的迭代器时,我在调试模式下运行 vs2008 SP1 时遇到了一些问题。下面的程序重现了这个问题(字符串析构函数崩溃):

#define _HAS_ITERATOR_DEBUGGING 0

#include <sstream>

int do_stuff(std::string const& text)

    std::string::const_iterator i(text.end());
    return 0;


int main()

    std::ostringstream os;
    os << "some_text";
    return do_stuff(os.str());

我在 gamdev.net 上找到了一个 similar post,讨论了在 vs2005 中存在这个问题。该帖子中的示例程序按原样在 2008 SP1 上为我编译 - 但是当我修改它以使用 ostringstream 时,我能够解决问题。

在调试器中四处寻找,看起来该库将迭代器从堆栈中弹出,然后尝试在 _Orphan_All 中使用它们,这是某种迭代器检查清理代码...

谁能重现这个问题或告诉我发生了什么?

谢谢!

【问题讨论】:

【参考方案1】:

我刚刚在 Windows XP 上的 VS2008 中尝试过此操作,并在 SP1 之前和之后的 VS2008 上收到有关缓冲区溢出的警告。

有趣的是,问题似乎集中在通过引用或按值将字符串传递给 do_stuff - 如果我使用原始代码,它会抱怨缓冲区溢出,但如果我通过 value,它运行良好。这与多线程调试 DLL 运行时有关。当您喜欢静态 MT Debug 运行时时,错误就会消失。

在这两种情况下,预编译头文件都已关闭,并且通常生成预编译头文件的文件已从项目中删除。

在阅读this article on MSDN 之后,我想知道如果您使用调试 DLL 运行时构建,问题是否源于几个 C++ 标准库类实际上驻留在运行时库中(只需尝试链接 VS2008 生成的二进制文件)针对早期的库并注意未解决的外部以确认这一点)。

【讨论】:

那篇文章给出了确切的答案:“...... VC9 中还存在两个已知错误,其中一个无法在不破坏二进制兼容性的情况下在 VC9 中修复。您可能会遇到这些错误; 但是,因为它们在字符串中(并且据我们所知,特定于使用字符串流)......”我需要字符串流来创建问题。感谢大家的帮助!【参考方案2】:

看起来这是 VS2005 中的一个已知错误,已在 VS2005 SP1 中修复:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=99655

看起来这是由在 gamedev.net 上发布相关内容的人提交的。

我不确定它是如何或为什么会悄悄回到 VS2008(您是否有来自 VS2005 的标头可能会妨碍或其他什么?)

【讨论】:

我确实有 VS2005 - 我尝试为它隐藏整个文件夹并重建,但我仍然得到相同的结果。不过,gamedev 家伙不必使用 ostringstream 来重现问题。我不知道是不是他们没有关闭的一些漏洞。 我通常不喜欢“编译器错误”,但考虑到相似性(但带有 ostringstream 扭曲),这似乎是一种确定的可能性。【参考方案3】:

您的代码在我的 VS2005 上的调试/发布模式下运行良好。我已关闭预编译头文件并使用运行时库的多线程 DLL 版本。

在 Vista 机器上使用 VS2008 SP1 进行检查(无预编译头文件,多线程 DLL)。工作得很好。

检查您的安装。

【讨论】:

也感谢您检查 2008 年。我在 WinXP 上运行,而不是 vista,尽管如果这有什么不同,我会有点惊讶。将检查我的安装。【参考方案4】:

我在 Microsoft 网站上报告了该问题。他们承认了这个错误并说他们已经在下一个版本中修复了它。

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=435483

【讨论】:

以上是关于在 vs2008 SP1 中禁用检查迭代器时出现问题 (_HAS_ITERATOR_DEBUGGING=0)的主要内容,如果未能解决你的问题,请参考以下文章

VS2008 安装项目会更新 Net 3.5 SP1 吗?

调试 XSLT 文件时 VS2008 SP1 崩溃

Win2K8 服务器(不是 R2)x64、VS2008 SP1 中没有 ASP.NET 控制智能感知

VS2008 SP1如何解决单步问题

安装 microsoft platform SDK for Windows Server 2003 SP1 后在 VS 2005 中编译时出现问题

C#程序在VS编译器加载时出现找不到方法,无法显示该程序窗体设计器