Стандартная функция C malloc
выделяет необработанную память, ничего не зная об объекте, который будет помещен в память.
Так что ни один конструктор объекта не будет вызван.
Узел структуры содержит элемент данных типа std::string
, для которого должен быть вызван конструктор.
В C ++ используйте оператор new
вместо вызова функции C malloc
. Оператор не только выделяет память, но и вызывает конструктор для созданного объекта.
Плохо использовать глобальные объекты в определениях функций, не передавая их через параметры.
Функция display
может иметь бесконечный цикл в случае, если head
не равен нулевому указателю, поскольку переменная ptr
(которая назначается с головой), используемая в цикле, не изменяется.
void display()
{
struct Node* ptr;
ptr = head;
while (ptr != NULL) {
std::cout << ptr->s << std::endl;
}
}
Функция вставки может быть вызвана только один раз
void insert(const std::string& name)
{
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
newnode->s = name;
newnode->next = NULL;
head = newnode;
}
потому что в противном случае это может привести к утечке памяти
Вы должны освободить узлы перед выходом из программы.
Вот модифицированная ваша программа, которая не имеет недостатков оригинальной программы.
#include <iostream>
#include <string>
struct Node
{
std::string s;
Node *next;
};
void insert( Node * &head, const std::string &s )
{
head = new Node { s, head };
}
std::ostream & display( const Node * head, std::ostream &os = std::cout )
{
for ( const Node *current = head; current != nullptr; current = current->next )
{
os << current->s << '\n';
}
return os;
}
void clear( Node * &head )
{
while ( head )
{
Node *tmp = head;
head = head->next;
delete tmp;
}
}
int main()
{
Node *head = nullptr;
insert( head, "Jimmy" );
display( head );
clear( head );
return 0;
}
Его вывод
Jimmy