Вероятно, есть много ошибок, но это большая ошибка
user *item = (user*) malloc(sizeof(struct user));
должно быть
user *item = new user;
В C ++ вы должны всегда использовать new
,Разница между new
и malloc
заключается в том, что malloc
не вызывает никаких конструкторов.Таким образом, в вашем user
объекте конструктор для string name
не вызывается.Таким образом, у вас есть неопределенное поведение (то есть потенциальные сбои) всякий раз, когда вы пытаетесь использовать name
.И, как указано в комментариях, вы также должны использовать delete
, а не free
, в основном по той же причине.
Посмотрев немного больше на код, вы обнаружите множество ошибок, связанных с указателями.Например, как насчет этого
list* temp = (list*)malloc(sizeof(struct friend_list));
temp = hashArray[ascii_key]->FriendList;
Забудьте немного о malloc против new, и просто посмотрите на приведенный выше код.У вас есть указатель temp
, который вы указываете на некоторую выделенную память.Затем вы выбрасываете эту память и вместо нее ставите temp
на hashArray[ascii_key]->FriendList
.Какой смысл выделять память, если вы ею не пользуетесь?Затем вы усугубляете ошибку, освобождая память в конце функции.
free(temp);
, но temp
больше не указывает на выделенную память (потому что вместо этого вы указали на список друзей).Понятно, что вы действительно еще не понимаете указатели и распределение памяти.
Вот как вы должны написать эту функцию
void check_friendship( int ascii_key, string name)
{
list* temp = hashArray[ascii_key]->FriendList;
while( temp != NULL)
{
if(strcmp(temp->name.c_str(), name.c_str()) == 0)
{
cout<<"Friendship exist"<<endl;
return;
}
temp = temp->next;
}
cout<<"No Record of Friendship"<<endl;
}
См. нет выделения вообще .Я полагаю, у вас в голове есть какое-то правило, где бы ни был указатель, я должен выделить немного памяти.Это не правда, распределение - это создание новых объектов.check_friendship
не создает никаких новых объектов (он только проверяет существующие), поэтому ему не нужно ничего выделять или освобождать.
remove_friendship
имеет ту же проблему, так как он удаляет дружбу, которую он долженdelete
один объект (дружба удаляется), но для него нет причин выделять что-либо.
add_friendship
имеет ту же ошибку, но в обратном порядке.add_friendship
должен выделить один новый объект для добавляемой дружбы, вы делаете это, но затем вы пытаетесь освободить объект в конце функции.Вы действуете в соответствии с неким общим правилом, согласно которому каждая переменная-указатель должна быть выделена, а затем освобождена, вместо того, чтобы логически думать о том, какие объекты должна создавать или уничтожать каждая функция.