2017-04-23 23 views
1

のベクトルへのポインタを参照解除するときに、私はクラスのクローズドハッシュハッシュテーブルを作成していると私は構造C++セグメンテーションフォールト構造

struct Example { 
    string key; 
    string data; 

    Example() { key = "000"; } 
}; 

とそのポイントメンバーを含むクラスを持っています構造体のベクトル、コンストラクタ、関数を使って問題を説明します。

class hash_table { 
    private: 
    vector<Example>* hash; 

    public: 
    hash_table(int size); 
    void dummy_method(); 
}; 

ユーザ/ファイル入力に基づいてベクトルの構造の数を動的に割り当てることを意味します。それは「000」 10回を出力として

hash_table :: hash_table (int size=10) 
{ 
    //initialize vector 
    vector<Example> * hash = new vector<Example>(size); 
    //test objects 
    for(int i=0;i<size;i++) 
    cout<<(*hash)[i].key<<endl; 
} 

上記のコードでは、10人のメンバーを初期化するために表示されます。しかし

、かつて私は、私はセグメンテーションフォールトを取得

void hash_table::dummy_method() { 
    cout<<(*hash)[0].key<<endl; 
} 

をdummy_method-呼び出すことにより、これを試して

私はこれもこれを行うには正しい方法ではないかなり確信しているが、私は」永遠に探していた/私は解決策を見つけることができない。しかし、私は絶対に構造体のベクトルへのポインタを使用しなければなりません、そして、私はこれらの構造体のそれぞれを動的に割り当てることになっていると確信しています。助けてくれてありがとう。

は(も、はい、私たちは実際に名前空間を使用する必要があり、これなしSTDどこでも)

+3

ベクトルへのポインタではなく、ベクトルを格納する必要があります。これにより、バグの範囲が縮小されます。 – juanchopanza

+0

'htable'とはどのように定義されていますか?あなたが求めている問題を再現する完全なサンプルコードを投稿してください。それ以外の場合は、有用な答えを与えるのは難しいです。 – emlai

+0

申し訳ありませんが、htableは大きなプログラムからのものです。問題を切り分けるために、大きなプログラムの関数を小さなプログラムにコピーしました。正しいコードを反映するように編集しました。現在のところ、これは完成したプログラムなので、問題があれば孤立させるべきです。 –

答えて

2

vector<Example> * hash = new vector<Example>(size);式が名前hashでローカル変数を初期化します(初期化されていない残っている)ではないhash_table::hashメンバー。

+0

ありがとうございます。 hash_table :: hashメンバを動的に初期化し、動的に割り当てられた構造体をそれに設定する簡単な方法があるかどうか知っていますか?申し訳ありませんが、それはばかげた質問、私の脳ちょっと解明しようとしてから溶けているすべて。 –

+0

'vector *'部分を削除するか、クラスメンバーを扱っていることを明示的に示すために、 'this-> hash'と書き直すだけです。このような名前の衝突はC++では面倒です。メンバ変数が 'm_'で始まるように、これを防ぐためにいくつかの命名規則を使用したい場合があります。通常の変数は常にlower_caseで書かれ、関数は常にCamelCaseで書かれ、 't_'、名前空間は' n_'で始まります。 – VTT

+0

私は信じられないほど愚かな誰かが答えた瞬間に感じるつもりだったと私は間違っていませんでした。私は本当に助けに感謝します。 –

関連する問題