#c
#c
Вопрос:
У меня есть структура (предполагается, что она используется как лист двоичного дерева):
struct node
{
string key;
long value;
struct node *left;
struct node *right;
};
Я хотел бы инициализировать новый объект типа «узел» и установить его свойства.
void insert(string key, struct node **leaf)
{
if( *leaf == 0 )
{
*leaf = (struct node*) malloc( sizeof( struct node ));
(*leaf)->value = 1;
(*leaf)->key = key; // crash here
(*leaf)->left = 0;
(*leaf)->right = 0;
}
(........)
}
Установка значения для «длинного значения» прошла нормально, но при попытке установить «строковый ключ» моя программа выходит из строя, и я получаю «нарушение доступа».
Почему и как это исправить?
Комментарии:
1. Используйте
*leaf = new node ();
, чтобы заставить это работать правильно!2. Строка является объектом контейнера, а не структурой POD
Ответ №1:
Вы должны использовать operator new
вместо использования функции C malloc
, чтобы выделить новый объект типа node. В этом случае компилятор вызовет конструктор defalut для ключа элемента данных типа std::string
. В противном случае ключ элемента данных не будет создан
Например
*leaf = new node { key, 1, 0, 0 };
или
*leaf = new node();
( *leaf )->key = key;
( *leaf )->value = 1;
элементы данных слева и справа будут инициализированы нулем оператором new .
Ответ №2:
malloc
не инициализирует типы. Это означает, что он не запускает конструкторы. string
это тип класса, который имеет конструктор. Итак, в вашем коде key
элемент находится в недопустимом состоянии. Следовательно, попытка его использования вызовет проблемы.
Вы почти никогда не должны использовать malloc
в программе C . Используйте new
вместо этого. new
был разработан для работы с типами классов и вызова их конструкторов. Просто помните, что тогда освобождение должно выполняться через delete
вместо free
.