2011-09-16 45 views
3

下面的代碼產生了segementation錯誤,我不明白爲什麼。下面的代碼使用一個向量來存儲多個大結構,但代碼不運行並生成分段錯誤。我不明白爲什麼。我的理解是,矢量調整大小分配堆中的內存,所以這不應該是一個堆棧溢出問題。我的系統具有非常大的物理內存(256 GB),代碼以64位模式編譯,因此只分配40 MB應該不成問題。有任何想法嗎?在調整大型結構矢量的大小時出現分段錯誤

非常感謝你提前,

#include <vector> 

using namespace std; 

typedef struct _tmp_t { 
    int a_data[10*1000*1000];/* large array */ 
} tmp_t; 

int main(void) { 
    vector<tmp_t> v_tmp; 

    v_tmp.resize(1); 

    return 0; 
} 
+0

這就是所有的代碼? 'resize'可能需要兩倍於當前'容量'的內存,但對於這種特殊情況應該不成問題。 segfault在哪裏指向? –

+3

在C++中,至少有15年的時間了,你不需要鍵入你的結構。 –

回答

10

的問題是,調用std::vector::resize將創建臨時對象(注意,它有一個第二個參數默認爲T());這些駐留在堆棧上。所以你在吹你的堆棧。

+0

這是有道理的,但真的有一個原因,stl向量應該創建一個臨時對象,只是調整大小? – Kang

+0

聽起來像C++ 11會解決這個問題! –

+0

@康:是的。它需要構建每個新的對象;根據第二個參數調整'resize'複製構造。如果你沒有提供第二個參數,那麼它使用默認值,即'T()'。 –