![](/img/trans.png)
[英]Segmentation fault while initializing vector by an initialized array in 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();
該程序將返回一個巨大的數字1457283635
,而不是預期的返回值0
。
到處搜尋,我發現我應該初始化空位置。 然后我嘗試一下:
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
語句中使用()
,您實際上已經完成了后者,只創建了一個包含n
foo*
元素的向量。
您應該通過使用向量向量來解決此問題,因此您不必自己進行內存管理。
std::vector<std::vector<foo*> > vec(n);
然后,這將創建foo*
n
空向量。
您的要求表明您必須使用動態內存嗎?
如果沒有,創建起來可能更簡單:
vector<foo*> vec;
然后將vec用作“常規”矢量變量,而不是使用指向矢量的指針?
然后,這樣做更簡單(?):
vector<foo*> vec;
foo* pFoo = something;
vec.push_back(pFoo);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.