2011-10-06 15 views
5

このコード例で "アクセス違反の読み取り場所"が表示される理由を教えていただけますか?そして、どうすればこの問題を解決できますか?このコードで「場所を読み取るアクセス違反」エラーが発生するのはなぜですか?

#include <vector> 
using namespace std; 
struct StructTest; 
struct Struct1; 
typedef struct Struct1{ 
    StructTest* test; 
} Struct1; 

typedef struct StructTest{ 
    vector<Struct1*> test123; 
} StructTest; 

static StructTest* abc; 

int test(){ 
    abc = (StructTest*) malloc(sizeof(StructTest));; 
    Struct1* a1 = (Struct1*) malloc(sizeof(Struct1)); 
    a1->test = abc; 
    abc->test123.push_back(a1); 
    return 0; 
} 

int main(){ 
    test(); 
    return 0; 
} 
+0

エラーの原因は次のうちどれですか? –

+0

+1よく尋ねられる質問([sscce](http://sscce.org)) – Flexo

答えて

4

それは、この行にクラッシュです:あなたはそれをmallocを使用して、上記の2行を割り当てるため

abc->test123.push_back(a1); 

理由があります。したがって、test123の内容は初期化されません。それでpush_backと呼ぶとクラッシュします。

+0

あなたの迅速な返答をありがとう、どうすればこの問題を解決できますか? – tandaica0612

+0

'malloc(sizeof(StructTest))'の代わりに 'new StructTest'を使います。他の 'malloc'にも同じことが適用され、代わりに' new'が使用されます。 – Mysticial

6

test123を作成していません。 mallocではなくnewで構造体を割り当ててください。test123が作成されます。

abc = new StructTest; 
Struct1* a1 = new Struct1; 

deleteではなくfreeで処分することを忘れないでください。

実際、C++を使用しているので、単にmallocの使用をやめてください。

1

mallocは使用しないでください。新しいものを使用してください。 mallocはコンストラクタを呼び出さないので、あなたのベクトルは有効なオブジェクトではありません。

0

"malloc"でブロックを割り当てると、ガベージ、ゼロなどが含まれている可能性があります。

オブジェクトtest123は、コンストラクタが実行されていないC++オブジェクトです。オペレーターnewを代わりに使用してみてください。

また、私たちが対象としているのはC++で、typedef構造体は必要ありません。それらは自動的にファーストクラスの名前になります。

関連する問題