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

Nat*_*one 7 c++ crash debugging iterator visual-studio-2008

当我尝试禁用已检查的迭代器时,我在调试模式下运行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());
}
Run Code Online (Sandbox Code Playgroud)

我在gamdev.net上发现了类似的帖子,讨论了在vs2005中遇到这个问题.该帖子中的示例程序按原样编译为2008 SP1 - 但是当我将其修改为使用ostringstream时,我能够解决问题.

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

任何人都可以重现这个问题或者告诉我发生了什么事吗?

谢谢!

Tim*_*sch 6

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

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

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

MSDN上阅读这篇文章后,我想知道问题是否源于几个C++标准库类实际上驻留在运行时库中,如果你使用调试DLL运行时构建(只是尝试将VS2008生成的二进制文件链接到一个早期的图书馆,并留意未解决的外部确认这一点).