Присвоить строковое значение свойству в указателе на структуру

#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 .