calloc (), malloc () против создания структуры, в которой есть неупорядоченная_карта

Я создаю структуру, которая имеет поле, которое является unordered_map в куче. Когда я использую новый, я могу добавить к нему без проблем. Но с calloc я получаю ошибку вставки, потому что размер корзины равен 0. Он работает нормально после того, как я вызываю резерв.

Итак, когда calloc вызывается для структуры, конструктор unordered_map не запускается? Я запутался, почему, если он был в новой структуре, он, похоже, имеет ненулевой размер корзины. И есть ли лучший способ сделать это помимо вызова резерва? (Я не могу использовать delete в этом случае, поэтому мне нужно придерживаться вызова calloc)

0

Решение

Ты прав, malloc() и др. не запускают конструкторы, тогда как new делает.

Вы не можете полагаться на то, что reserve() после calloc() кажется, чтобы решить проблему. Это не так. Поведение вашего кода все еще не определено, и он может взорваться в любой момент и любым удобным способом.

Один из способов решить эту проблему — использовать размещение new позвонить unordered_mapконструктор.

Кроме того, вы можете превратить поле в указатель, calloc() struct, а затем использовать new выделить и построить unordered_map, Если вы сделаете это, вам придется вручную delete Это.

5

Другие решения

Функции выделения памяти на C обычно не вызывают конструкторы. Увидеть Маллок против нового. Первый ответ резюмирует это довольно хорошо: не использование malloc в C ++.

1

calloc ничего не делает для инициализации ваших объектов как объектов. Это в основном вручает вам указатель на некоторую память, заполненную нулями. Поэтому любые внутренние поля, которые требуют инициализации, например ваша карта, не получают его. Вы не должны использовать calloc вместе с объектами. (Действительно, вам, вероятно, не нужно это вообще.)

0
По вопросам рекламы [email protected]