初始化空 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);
这将创建 n
个 foo*
的空向量。
您的要求是否表明您必须使用动态内存?
如果没有,创建起来可能更简单:
vector<foo*> vec;
然后将 vec 用作 'regular' 向量变量,而不是使用指向向量的指针?
那么就更简单了(?):
vector<foo*> vec;
foo* pFoo = something;
vec.push_back(pFoo);
我正在尝试使用这样的向量数组:
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);
这将创建 n
个 foo*
的空向量。
您的要求是否表明您必须使用动态内存?
如果没有,创建起来可能更简单:
vector<foo*> vec;
然后将 vec 用作 'regular' 向量变量,而不是使用指向向量的指针?
那么就更简单了(?):
vector<foo*> vec;
foo* pFoo = something;
vec.push_back(pFoo);