簡體   English   中英

初始化空的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();

該程序將返回一個巨大的數字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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM