在 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)的主要内容,如果未能解决你的问题,请参考以下文章
Win2K8 服务器(不是 R2)x64、VS2008 SP1 中没有 ASP.NET 控制智能感知
安装 microsoft platform SDK for Windows Server 2003 SP1 后在 VS 2005 中编译时出现问题