当我尝试禁用已检查的迭代器时,在 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/