【问题标题】:C++: Segmentation fault while iterating over vector of pointers while push_backC ++:在push_back时迭代指针向量时出现分段错误
【发布时间】:2020-02-07 00:47:22
【问题描述】:

我想遍历指向对象的指针向量。在迭代时,我必须 push_back 指向向量的新指针。在循环之前,push_backs的数量是未知的,也没有abort条件,所以不能使用while循环。

这是一个在整数上使用指针的示例,它显示了与带有对象的版本相同的错误:一次迭代后分段错误(核心转储)。

vector<int*> vec;
int a = 43;
vec.push_back(&a);

for (vector<int*>::iterator it = vec.begin(); it != vec.end(); ++it) {
    cout << *(*it) << " " << *it << endl;
    vec.push_back(&a);
}

相同的代码但使用整数效果很好。

vector <int>vec;
int a = 43;
vec.push_back (a);

for (vector < int >::iterator it = vec.begin (); it != vec.end (); ++it){
    cout << (*it) << " " << *it << endl;
    vec.push_back (a);    
}

【问题讨论】:

  • vec.push_back(&amp;a); 将即将超出范围(然后将是无效)的局部变量的地址推送到向量。这不太可能是你想要的。
  • 感谢您的回答。在我的代码中,我想使用这个循环来替换递归。我会推回对象上的指针,而不是整数指针。我将切换到 std::stack。

标签: c++ for-loop pointers segmentation-fault


【解决方案1】:

push_back 在将结果附加到 size &gt; capacity 时使迭代器无效,因此它重新分配并复制到新空间。

将给定的元素值附加到容器的末尾。

1) 新元素被初始化为值的副本。

2) 值被移动到新元素中。

如果新的 size() 大于 capacity() 则所有迭代器和 引用(包括过去的迭代器)无效。 否则只有过去的迭代器无效。

另外,正如@Jesper 指出的那样,您在vector 中存储了对局部变量的引用:

int a = 43; 
vec.push_back(&a);

如果在您的 vector 之前超出范围,您将有悬空引用。

【讨论】:

  • 您忽略了将本地(即将失效)变量的地址放入向量中的问题。如果它也解决了这个问题,你的答案会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2017-09-20
相关资源
最近更新 更多