std::string 构造函数中的迭代器列表已损坏

发布于 2024-08-24 18:05:48 字数 585 浏览 7 评论 0原文

下面在 VS2005 SP1 的调试配置中编译的代码显示了两条带有“ITERATOR LIST CORRUPTED”通知的消息。

代码片段

#define _SECURE_SCL 0
#define _HAS_ITERATOR_DEBUGGING 0

#include <sstream>
#include <string>

int main()
{
  std::stringstream stream;
  stream << "123" << std::endl;
  std::string str = stream.str();
  std::string::const_iterator itFirst = str.begin();
  int position = str.find('2');
  std::string::const_iterator itSecond = itFirst + position;
  std::string tempStr(itFirst,itSecond); ///< errors are here
  return 0;
}

这是编译器或标准库中的错误吗?

The code below compiled in Debug configuration in VS2005 SP1 shows two messages with “ITERATOR LIST CORRUPTED” notice.

Code Snippet

#define _SECURE_SCL 0
#define _HAS_ITERATOR_DEBUGGING 0

#include <sstream>
#include <string>

int main()
{
  std::stringstream stream;
  stream << "123" << std::endl;
  std::string str = stream.str();
  std::string::const_iterator itFirst = str.begin();
  int position = str.find('2');
  std::string::const_iterator itSecond = itFirst + position;
  std::string tempStr(itFirst,itSecond); ///< errors are here
  return 0;
}

Is it a bug in the compiler or standard library?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

世俗缘 2024-08-31 18:05:48

我的坏!编辑:是的,编译器有问题。请参阅 - 特别是社区内容部分。

My bad! Edit: Yeah problem with compiler. See this -- particularly the Community Content section.

嗼ふ静 2024-08-31 18:05:48

@dirkgently 在他的编辑中说了什么。

显然,std::string的一些代码位于运行时dll中,特别是宏定义对构造函数不生效,而迭代器调试的代码被执行。您可以通过静态链接运行时库来解决此问题。

我认为这是一个错误,尽管可能不是在 Visual Studio 本身中,而是在文档中。

What @dirkgently said in his edit.

Apparently, some code for std::string is located in the runtime dll, in particular the macro definition does not take effect for the constructor an the code for iterator debugging gets executed. You can fix this by linking the runtime library statically.

I would consider this a bug, though perhaps not in the Visual Studio itself, but in the documentation.

美人如玉 2024-08-31 18:05:48

您的代码有问题。好吧,事实上有几个:

  1. std.find('2') 返回一个 size_t,如果 size_t 的值存在潜在的转换问题> 返回的(如 std::string::npos)优于 int 可以容纳的内容(我认为你最终会得到一个负 int...)
  2. 如果position 为负数,或等于 std::string::npos 那么范围 itFirst,itSecond 定义不明确(因为 >itSeconditFirst 之前,或者因为它在 str.end() 之后)

更正您的代码,并检查它是否仍然抛出。迭代器调试可以帮助您捕获这些错误,使其像鸵鸟一样停止运行。

There is a problem with your code. Well, several in fact:

  1. std.find('2') returns a size_t, you have a potential cast problem if the value of the size_t returned (like std::string::npos) is superior to what an int can hold (you would end up with a negative int I think...)
  2. if position is negative, or equal to std::string::npos then the range itFirst,itSecond is ill-defined (either because itSecond is before itFirst or because it is past str.end())

Correct your code, and check if it stills throw. Iterator Debugging is here to help you catch these mistakes, disabling it acting like an ostrich.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文