【问题标题】:vector::insert segmentation fault矢量::插入分段错误
【发布时间】:2011-02-17 21:34:01
【问题描述】:

我有这样的课:

classA
{
public:
  classA()
   {
     //Here I am doing something but nothing related to vector

   }

   void updateVec(int idx, int value)
   {
     //Here, I want to update vector vector based on args passed
     myVec.insert(myVec.begin() + idx, value);

   }

  std::vector<int> myVec;
}

现在,插入语句出现分段错误。我需要在某处初始化向量吗?

【问题讨论】:

  • 我猜,它是一个整数向量 std::vector&lt;int&gt;...
  • 是的,不知何故,它在格式中被删除了。
  • updateVec 的哪个参数会使您的应用程序崩溃?此时您的vector 中有什么内容?

标签: c++ stl vector


【解决方案1】:

分段错误意味着您正在尝试访问/写入尚未(尚未)分配的内存。在您的情况下,根据idx 的值,myVec.begin() + idx 可以引用超出向量分配区域的内存。在插入之前,您需要确保您的向量至少可以容纳idx 元素。 updateVec 应该检查向量的当前大小,如果不够大,它应该调用vector::reserve 分配足够的空间以便插入新元素。

【讨论】:

  • 不完全是,idx 必须是 &lt;= vec.size()。容量、分配的区域和保留与它无关:即使内存已被保留,插入向量末尾之外的任何内容仍然没有任何好处。 - 至于错误处理,由提问者决定他们需要什么。
【解决方案2】:

从您的代码看来,您没有正确初始化它。

初始化用作本地变量
创建一个整数向量,大小为 3,初始化为 0

std::vector&lt;int&gt; myvector (3,0);

如何在类的构造函数中初始化(然后调整大小)向量的简短示例

#include <iostream>
#include <vector>

class A {
public:
   A(int size);
   ~A();
   void updateVec(int idx, int value);
   void print();
private:
  std::vector<int> myVec;
};

A::A(int size) {
    myVec.resize(size);
}

A::~A() {
}

void A::updateVec(int idx, int value) {
     myVec.insert(myVec.begin() + idx, value);
}

void A::print() {
    std::vector<int>::iterator it;
    for (it=myVec.begin(); it!=myVec.end(); it++) {
        std::cout << " " << *it;
    }
}

int main() {
    A* a = new A(10);
    a->updateVec(2,10);
    a->print();
}

这里是关于如何在 C++ 中使用向量的文档/示例
http://www.cplusplus.com/reference/stl/vector/insert/

【讨论】:

  • 你不能用这种方式初始化成员向量。
  • 不,我根本没有初始化它,只是声明了它。因为我不确定我需要放入多少元素。
  • @user333422 您需要将其初始化为某个值,否则您将尝试插入不存在(或未分配)的索引,这就是您获得@987654324 的原因@
  • @Kenny Cason:作为局部变量,它是正确的。但是该语法不能用于初始化类成员向量,您需要 .resize 或使用类构造函数初始化列表。
  • @Erik 啊好的,我明白你在说什么。是的,他需要在他的构造函数中初始化它。我只是想说明他需要初始化它,但我会更新我的答案。谢谢
【解决方案3】:

是的,你知道。向量开始是空的。任何尝试访问超出向量末尾的项目都会导致错误。

要提出解决方案,我们需要知道向量是否需要动态改变大小 - 或者如果它是固定大小,您会在什么时间点知道它需要多大。

另外,如果您更新向量的第 17 个元素,但当时它只包含 10 个项目,您是否也希望创建第 11 到 16 个项目?

【讨论】:

  • 它的大小动态变化。就在我插入之前,我开始知道,我需要在什么位置插入。可能有一些空位,例如您的职位。 11 到 16 可能不包含任何有意义的内容。
  • 访问结束后的向量是未定义的行为。短语“将导致错误”可能会推动您将崩溃的观点(不幸的是,这不是真的)。在 C++ 中没有运行时错误天使,只有未定义的行为守护进程。
  • @user333422 - 你以前用过 STL map 吗?如果您希望有空头寸,它可能是比向量更好的选择。您认为在应用程序的运行过程中可能会添加多少项目?您多久检索一次物品?而且,如果您尝试检索“空位”,您希望采取什么行为?
  • 嗨,我也意识到 map 将是一个更好的解决方案,所以我现在正在更改我的代码以使用地图。
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2019-10-18
  • 2015-04-01
相关资源
最近更新 更多