2016-12-01 13 views
1

ポインタの配列を作成しようとしています。ポインタの配列から印刷しようとすると奇妙な出力が発生するC++

struct vertex 
{ 
std::string id; 
std::string name; 
int networkID; 
std::vector<adjVertex> friends; 
bool visited; 
}; 

struct hobbylist 
{ 
std::string hobby; 
std::vector<vertex*> list; 
}; 

hobbylist * hobbies[HASHMAP_SIZE]; 

趣味アレイにユーザーを追加する:

int Graph::addUserToHobby(std::string hobby1, std::string id){ 
// initial key is based on the first 2 characters of the hobby name 
int key = (hobby1[0] + hobby1[1]) % HASHMAP_SIZE; 
cout << " initial hashmap key " << key << endl; 
hobbylist *h = new hobbylist; 
h->hobby = hobby1; 
hobbies[key] = h; 
} 

私の目標は、hobbylist型のポインタの配列を作成することで、私が終わるその配列の内容を印刷しようとすると、非常に奇妙なランダムなシンボル出力:

GLIBC_2.2.5GLIBCXX_3.4.13GLIBCXX_3.4.14CXXABI_1.3GLIBCXX_3.4のP & Y

私は、印刷しようそのように:私は間違って印刷していた場合や、私が間違って趣味アレイに趣味を追加していた場合

void Graph::displayHobbies(){ 
cout << "========================================\n"; 
cout << "DISPLAYING HOBBY INTERESTS =============" << endl; 
for(auto const& value: hobbies) 
{ 
    cout << value->hobby << ":" << endl; 
} 
} 

私は思っていました。

変更されたコード:

hobbylist *h = new hobbylist; 
h->hobby = hobby1; 
if(hobbies[key] ==NULL){ 
h->list.push_back(user); 
hobbies[key] = h; 
} 
else if (hobbies[key]!=NULL){ 
    h= hobbies[key]; 
    h->list.push_back(user); 
} 

変更上記のコードはあると私は機能を最初に実行するときにelse文の最後の行でワンセグ障害を取得していますし、機能がに行くと、なぜ私は混乱しています配列が空でなければならないので、最初の関数実行時にhobbies [key]がnullになるはずのelse文?

+0

配列のポインタを 'nullptr'(' hobbylist * hobbies [HASHMAP_SIZE] {} ')に初期化し、印刷前にチェックします(' if(value){std :: cout << value-> hobby << ":" << std :: endl;} ')。 – Jarod42

+0

さらに、 'std :: unique_ptr 'の配列を使って手作業によるメモリ管理を避けてください。 – Jarod42

+0

'std :: map '(または 'std :: unordered_map')は、趣味が名前でキーインされているので、もっと意味があります。 –

答えて

3

少なくとも2つのバグがあります。

hobbylist *h = new hobbylist; 
h->hobby = hobby1; 
hobbies[key] = h; 

keyはハッシュキーです。 hobbies[key]に既にポインタがある場合、メモリがリークします。

for(auto const& value: hobbies) 
{ 
    cout << value->hobby << ":" << endl; 
} 

これは、hobbiesハッシュアレイのすべてのスロットにポインタが含まれていることを前提としています。これは起こりそうもない。ある特定のvaluehobbiesに初期化されていない場合(以前に挿入されたhobbiesはそのハッシュキーに割り当てられていません)、ポインタはNULLになり、value->hobbyNULLポインタの参照を解除しようとします。それはあなたの可能性のあるクラッシュです。

+0

これは、 "メモリリーク"カテゴリの下にあるようです。 –

+0

私はそれをちょっと変えました: –

+0

メインポストにコードを入れて読みやすくします –

関連する問題