当我尝试禁用已检查的迭代器时,我在调试模式下运行的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中使用它们,这是某种迭代器检查清理代码......
其他人可以重现这个问题或告诉我发生了什么事吗?
谢谢!
答案 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