2016-12-01 2 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 & у

попытке печати это как это:

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, когда массив должен быть пустым, и поэтому хобби [ключ] должен быть пустым при первом запуске функции?

+0

Инициализировать указатели массива на 'nullptr' (' hobbylist * hobbies [HASHMAP_SIZE] {} ') и проверить это перед печатью (' if (value) {std :: cout << value-> hobby << ":" << станд :: епсИ;} '). – Jarod42

+0

Или даже лучше, используйте массив 'std :: unique_ptr ', чтобы избежать ручного управления памятью. – Jarod42

+0

Может быть, 'std :: map ' (или 'std :: unordered_map') будет иметь больше смысла, поскольку хобби вводятся по имени, что и подходит для« карты ». –

ответ

3

У вас есть как минимум две ошибки.

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

key - ваш хэш-ключ. Если hobbies[key] уже имеет указатель, это приведет к утечке памяти.

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

Это предполагает, что каждый слот в хеш hobbies содержит указатель. Это маловероятно. Если конкретный value в hobbies никогда не был инициализирован (ни один из ранее вставленных hobbies, сопоставленных с этим хэш-ключом), указатель будет NULL, а value->hobby попытается разыменовать указатель NULL, что приведет к неопределенному поведению. Это ваш вероятный сбой.

+0

Это похоже на категорию «утечка памяти», как описано. –

+0

, поэтому я немного изменил его: –

+0

Я положу код в основной пост, чтобы он был более читаемым –

Смежные вопросы