2011-09-16 9 views
3

以下のコードは、セグメンテーション違反を生成していますが、その理由を理解できません。以下のコードでは、ベクトルを使用して複数の大きな構造体を格納していますが、コードは実行されず、セグメンテーション違反が生成されます。なぜか分からない。私の理解は、ベクトルのサイズ変更はヒープでメモリを割り当てるので、スタックのオーバーフローの問題ではないはずです。私のシステムは非常に大きな物理メモリ(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'は潜在的に現在の' capacity'の2倍のメモリを必要とする可能性がありますが、この特定の場合には問題にはなりません。 segfaultはどこを指していますか? –

+3

C++では、少なくとも15年間、構造体をtypedefする必要はありません。 –

答えて

10

問題がstd::vector::resizeを呼び出すと、一時オブジェクトを作成することで、事前にありがとうございました(それは第二引数を持っていることに注意してT()デフォルト)。これらはスタックに存在します。だからあなたはあなたのスタックを吹き飛ばしている。

+0

これは理にかなっていますが、本当にstl vectorはサイズ変更のための一時オブジェクトを作成する必要がありますか? – Kang

+0

C++ 11のような音がこれを解決します! –

+0

@ Kang:はい。新しいオブジェクトをそれぞれ作成する必要があります。第2引数に基づいて 'resize'コピーコンストラクトを作成します。 2番目の引数を指定しないと、デフォルトの 'T()'が使用されます。 –

関連する問題