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

MFS*_*MFS 0 c++ initialization vector

我试图使用这样的矢量数组:

vector<foo*> *vec = new vector<foo*>(n);
Run Code Online (Sandbox Code Playgroud)

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

vec[i].push_back(&foo_var);
Run Code Online (Sandbox Code Playgroud)

我的问题是vec的空位.让我们说,i等于0,我push_back什么都没有.然后,当我尝试做一些检查时,例如,

vec[0].size();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

vec[i] = vector<foo*>();
Run Code Online (Sandbox Code Playgroud)

程序发送分段错误错误.

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

Vla*_*cow 10

看来你的意思是

vector<foo*> *vec = new vector<foo*>[n];
Run Code Online (Sandbox Code Playgroud)

代替

vector<foo*> *vec = new vector<foo*>(n);
Run Code Online (Sandbox Code Playgroud)

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

std::vector<std::vector<foo *>> vec( n );
Run Code Online (Sandbox Code Playgroud)