Не могу создать двусвязный список со стринговыми данными
Проблема в том что когда выделяю память под новый узел в двусвязном списке, то при присваивании стринговой переменной name строку, вылетает ошибка: нарушение прав доступа при чтении по адресу
void push(ELEMENT* list, int num_b, int num_r, string n)
{
ELEMENT* p;
p = (ELEMENT*)malloc(sizeof(ELEMENT));
p->number_bus = num_b;
p->number_route = num_r;
p->name = n;
insert(list, p);
}
Вот сама структура узла
typedef struct ELEMENT
{
int number_bus;
int number_route;
string name;
ELEMENT* next;
ELEMENT* past;
}ELEMENT;
Когда убираю переменную name или ничего ей не присваиваю то всё работает. Хотел бы понять почему так происходит и как это исправить.
Ответы (1 шт):
Если коротко, вместо функции malloc следует использовать оператор new для создания новых объектов:
void push(ELEMENT* list, int num_b, int num_r, string n)
{
ELEMENT* p;
p = new ELEMENT;
//...
}
Функция malloc - это Си функция, она ничего не знает об объектах С++ и их конструкторах.
Она просто выделяет кусок сырой неинициализированной памяти. Проще говоря, после
p = (ELEMENT*)malloc(sizeof(ELEMENT));
область, на которую указывает p, не содержит никакого объекта типа string,
лишь участок выделенной памяти, в котором еще предстоит его создать.
Оператор new, в свою очередь, помимо выделения памяти, вызывает конструктор объекта (и его членов).
Таким образом, вновь созданный объект типа ELEMENT будет содержать объект типа string.
P.S. Не забудьте, что объекты, созданные оператором new должны удаляться с помощью оператора delete.
Т.е., если Вы выделяли память с помощью malloc, а освобождали с помощью free, то, при создании объектов
с помощью new, удалять их нужно с помощью delete.