Я создаю структуру, которая имеет поле, которое является unordered_map в куче. Когда я использую новый, я могу добавить к нему без проблем. Но с calloc я получаю ошибку вставки, потому что размер корзины равен 0. Он работает нормально после того, как я вызываю резерв.
Итак, когда calloc вызывается для структуры, конструктор unordered_map не запускается? Я запутался, почему, если он был в новой структуре, он, похоже, имеет ненулевой размер корзины. И есть ли лучший способ сделать это помимо вызова резерва? (Я не могу использовать delete в этом случае, поэтому мне нужно придерживаться вызова calloc)
Ты прав, malloc()
и др. не запускают конструкторы, тогда как new
делает.
Вы не можете полагаться на то, что reserve()
после calloc()
кажется, чтобы решить проблему. Это не так. Поведение вашего кода все еще не определено, и он может взорваться в любой момент и любым удобным способом.
Один из способов решить эту проблему — использовать размещение new
позвонить unordered_map
конструктор.
Кроме того, вы можете превратить поле в указатель, calloc()
struct
, а затем использовать new
выделить и построить unordered_map
, Если вы сделаете это, вам придется вручную delete
Это.
Функции выделения памяти на C обычно не вызывают конструкторы. Увидеть Маллок против нового. Первый ответ резюмирует это довольно хорошо: не использование malloc
в C ++.
calloc
ничего не делает для инициализации ваших объектов как объектов. Это в основном вручает вам указатель на некоторую память, заполненную нулями. Поэтому любые внутренние поля, которые требуют инициализации, например ваша карта, не получают его. Вы не должны использовать calloc вместе с объектами. (Действительно, вам, вероятно, не нужно это вообще.)