使用std :: vector的插入成员函数插入到std :: vector中的Segfault

时间:2016-12-01 22:08:18

标签: c++ c++11 vector stl iterator

当我像这样插入矢量时:

*frontIter = vec[idx];

我得到一个段错误,但是如果我做了

vi vec(10);

它没有任何问题。我知道[]运算符有能力为对象分配空间然后插入它,是插入不分配空间的错误,它是否需要在某个位置调用insert时已经分配空间?

我认为这个错误是由于我对这有什么困惑:

vec.resize(10)

这类似于vec.reserve(10)using vi = std::vector<int>; using size = std::size_t; // return vi after partition vi partition_space(const vi & vec, size n) { vi resVec(vec.size()); int partVal = vec[n]; //resVec[n] = partVal; // iterators to the back and front of the resVec. // insertion will happen at the iters vi::iterator frontIter = resVec.begin(); vi::reverse_iterator backIter = resVec.rbegin(); for(size idx = 0 ; idx < vec.size() ; ++idx) { if(idx == n) { continue; } if(vec[idx] < partVal) // insert in front of partVal { // *frontIter = vec[idx]; resVec.insert(frontIter , vec[idx]); ++frontIter; } else if(vec[idx] > partVal)// insert at back of n { *backIter = vec[idx]; ++backIter; } else // repeated elements .. random choose to put it in front.. both choice does not matter { //resVec.insert(frontIter , vec[idx]); *frontIter = vec[idx]; ++frontIter; } } frontIter++; if(!std::distance(frontIter , backIter.base())) { std::cout << " ! " << std::endl; } *backIter = partVal; return resVec ; // nrvo }

在我调用vec.reserve(10)之后插入不能作为位置9工作吗?

这是代码段,只是为了确保我没有遗漏任何东西。

duk_push_c_function(ctx, someFunction, 1 /*nargs*/);
duk_push_pointer(ctx, (void *) somePointer);
duk_put_prop_string(ctx, -2, "_ptr");
duk_put_global_string(ctx, "someFunction");

1 个答案:

答案 0 :(得分:2)

错误是由于第一次插入发生后迭代器frontIter失效。以下是最新消息:

  1. 代码分配向量vec,其中包含10个元素。
  2. 将新元素插入到位置frontIter中,此触发器向量存储重新分配,因为向量超出其容量,因此插入代码重新分配内部存储以容纳插入。因此,此操作使所有 vec迭代器
  3. 无效
  4. 代码尝试使用旧的(无效的)迭代器插入新元素... - seg-fault!