【问题标题】:Segmentation fault on std::list.begin() [closed]std::list.begin() 上的分段错误 [关闭]
【发布时间】:2014-05-14 14:52:54
【问题描述】:

我已经初始化了一个迭代器,并将该迭代器分配给列表的开头,以通过以下方式迭代容器。

std::list<ptr*> list_var;
std::list<ptr*>::iterator iter = NULL;
iter = list_var.begin();

但神秘的是,执行第 3 行 {iter = list_var.begin();} 时会发生分段错误。 此时可能导致崩溃的原因是什么?

【问题讨论】:

  • 很多事情。 您的代码的某些其他部分可能已经损坏了堆,或者以其他方式触发了未定义的行为。该错误可能只是其他地方发生的问题的表现。
  • 拥抱 C++11。使用nullptr,而不是NULL。不要将任何一个分配给您的迭代器实例。此外,auto 保持迭代器代码整洁:auto iter = list_var.begin();
  • 请显示一些实际代码,您在问题中的代码甚至不应该编译!

标签: c++ iterator containers coredump


【解决方案1】:

随着迭代器的声明和初始化:

std::list<ptr*>::iterator iter = NULL;

您忘记了,您实际上并没有指定迭代器 指向 的位置(这是无处的),而是实际的迭代器 object 实例。事实上,该代码甚至不应该编译!它不应该编译,因为编译器无法将整数值(C++ 中的 NULL 就是 0)转换为 std::list&lt;ptr*&gt;::iterator 对象。

【讨论】:

  • 所以你认为iter 正在尝试释放NULL 构造它的指针?在这种情况下,复制构造函数不应该抛出吗?
  • @FrédéricHamidi 好吧,迭代器并没有指向任何地方,那么它应该将NULL 分配给什么?
  • 这就是为什么我说复制构造函数(看起来是在进行复制构造,而不是赋值)如果它不支持它应该在传递NULL 时抛出。当然,如果没有,一切都会发生。
  • @FrédéricHamidi 没有要求迭代器应该抛出。此外,由于 OP 提供的代码不可编译,这一点无论如何都没有实际意义。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多