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

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

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

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

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

其他人能否重现此问题或告诉我发生了什么事?

谢谢!

最佳答案

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

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

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

看完this article on MSDN我想知道问题是否源于这样一个事实:如果您使用调试 DLL 运行时进行构建,那么几个 C++ 标准库类实际上驻留在运行时库中(只需尝试将 VS2008 生成的二进制文件链接到较早的库并注意 Unresolved external 因素来证实这一点)。

关于c++ - 在 vs2008 SP1 中禁用检查迭代器时出现问题 (_HAS_ITERATOR_DEBUGGING=0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/787288/

相关文章:

node.js - 如何调试nodejs项目?

c++ - 在 C++ 中获取本地 IP 地址

c++ - 指向数据结构中元素的指针安全吗? (C++ 与 QT)

java - 创建网络虚拟硬盘/文件系统

c++ - 如何在 Qt 中分层独立的小部件?

c# - WCF 服务默认值

python - 如何确定程序是否因子进程而崩溃?

c++ - 在 64 位、VS2008、C++ 中替换 _asm nop

c# - 可以动态接受控制台命令的 Windows 服务应用程序

debugging - vs Code 调试 Blazor WASM 独立版