初始化空std :: vector C ++时出现分段错误

时间:2015-03-05 18:42:27

标签: c++ vector initialization

我正在尝试使用这样的矢量数组:

vector<foo*> *vec = new vector<foo*>(n);

vec的某些位置将为空,其中一些位置稍后将填充一些数据:

vec[i].push_back(&foo_var);

我的问题是vec的空位。让我们说i等于0,我没有push_back任何事情。然后,当我尝试做一些检查时,例如,

vec[0].size();

而不是预期的返回0,程序返回一个巨大的数字1457283635

搜索周围,我发现我应该初始化空位。然后我试试这个:

vector<foo*> vec = new vector<for*>(n);
for(int i = 0; i < n; i++) {
    vec[i] = vector<foo*>();
}
...

这个&#34;解决方案&#34;足以使我的程序按预期工作(例如,返回0作为空位的大小。)

然而,在增加n的大小后,我的程序现在崩溃了:

vec[i] = vector<foo*>();

程序发送分段错误错误。

  • 有人可以解释一下发生了什么吗?
  • 我该如何处理这个具体案件?
  • 在这种情况下,矢量初始化的最佳做法是什么?

3 个答案:

答案 0 :(得分:10)

看来你的意思是

vector<foo*> *vec = new vector<foo*>[n];

而不是

vector<foo*> *vec = new vector<foo*>(n);

第一个确实在动态存储器中分配了一个向量数组,而第二个向量分配了一个具有n个元素的向量。 考虑到您可以定义向量向量。例如

std::vector<std::vector<foo *>> vec( n );

答案 1 :(得分:0)

您的意思是创建n空向量,还是填充n元素的单个向量?

我假设前者,但是在()语句中使用new,您实际上完成了后者,只创建了一个包含n foo*元素的向量在它。

您应该使用向量向量来解决这个问题,这样您就不必自己进行内存管理了。

std::vector<std::vector<foo*> > vec(n);

然后,这会创建n的{​​{1}}个空向量。

答案 2 :(得分:0)

您的要求是否表明您必须使用动态内存?

如果没有,可能更容易创建为:

vector<foo*> vec;

然后使用vec作为常规&#39;向量变量,而不是使用指针到矢量?

然后更简单(?):

vector<foo*> vec;

foo* pFoo = something;

vec.push_back(pFoo);