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

Segmentation fault while initializing an empty std::vector C++

本文关键字:分段 错误 C++ std vector 初始化      更新时间:2023-10-16

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

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*>();
}
...

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

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

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

程序发送分段故障错误。

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

你的意思似乎是

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

而不是

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

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

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

您是想创建n空向量,还是用n元素填充单个否决器?

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

你应该使用一个向量的向量来解决这个问题,这样你就不必自己做内存管理了。

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

这随后创建foo*n空向量。

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

如果没有,创建为可能更简单

vector<foo*> vec;

然后使用vec作为"正则"向量变量,而不是使用指向向量的指针?

那么就更简单了:

vector<foo*> vec;

foo* pFoo = something;

vec.push_back(pFoo);