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

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

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

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

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

vec[i].push_back(&foo_var);

我的问题是 vec 的空位置。假设 i 等于 0,我没有 push_back 任何东西。然后,当我尝试做一些检查时,例如,

vec[0].size();

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

四处寻找,我发现我应该已经初始化了空位置。然后我试试这个:

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

这个 "solution" 足以让我的程序按预期运行(例如,returning 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 语句中使用 () 你实际上已经完成了后者,创建了一个带有 n [=16= 的向量]里面的元素。

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

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

这将创建 nfoo* 的空向量。

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

如果没有,创建起来可能更简单:

vector<foo*> vec;

然后将 vec 用作 'regular' 向量变量,而不是使用指向向量的指针?

那么就更简单了(?):

vector<foo*> vec;

foo* pFoo = something;

vec.push_back(pFoo);