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

时间:2009-04-24 19:42:39

标签: c++ visual-studio-2008 debugging crash iterator

当我尝试禁用已检查的迭代器时,我在调试模式下运行的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中使用它们,这是某种迭代器检查清理代码......

其他人可以重现这个问题或告诉我发生了什么事吗?

谢谢!

4 个答案:

答案 0 :(得分:6)

我刚刚在Windows XP上的VS2008中尝试了这个,并且在SP1和VS2008之前都收到了有关缓冲区溢出的警告。

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

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

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

答案 1 :(得分:4)

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

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

我不确定它会如何或为什么会重新进入VS2008(你是否有来自VS2005的标题,可能会遇到什么问题?)

答案 2 :(得分:1)

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

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

检查您的安装。

答案 3 :(得分:1)

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

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