В чем разница между "новыми" и "malloc" и "calloc" и другими в семье?
(Когда) Нужно ли что-нибудь, кроме "нового"?
Один из них реализован с использованием любого другого?
В чем разница между "новыми" и "malloc" и "calloc" и другими в семье?
(Когда) Нужно ли что-нибудь, кроме "нового"?
Один из них реализован с использованием любого другого?
new
и delete
являются специфическими для С++ функциями. Они не существовали в C. malloc
- это старая школа, способная делать вещи. В большинстве случаев вам не нужно использовать его в С++.
malloc
выделяет неинициализированную память. Выделенная память должна быть освобождена с помощью free
.calloc
похож на malloc
, но инициализирует выделенную память константой (0). Его нужно освободить с помощью free
.new
инициализирует выделенную память, вызывая конструктор (если это объект). Память, выделенная с помощью new
, должна быть выпущена с помощью delete
(которая, в свою очередь, вызывает деструктор). Вам не нужно вручную указывать необходимый размер и применять его к соответствующему типу. Таким образом, он более современный и менее подвержен ошибкам.new/delete + new []/delete []:
malloc/free + family:
Также см. мой ответ здесь
Как указывали другие сообщения: malloc/free является частью С++ для совместимости с C.
Также см.: Stroustrup: новый vs malloc
Использование новых средств, которые будут вызывать конструкторы для вновь выделенной памяти. Если выделенная вещь не имеет конструкторов, новый функционально идентичен malloc. и обычно должен использоваться в отношении к нему.
new может или не может быть реализовано в терминах malloc - стандарт С++ не требует ни одного подхода.
Вам не нужно ничего, кроме нового. Это полная замена malloc в С++.
Что касается разницы: Malloc просто выделяет память. Новая выделенная память и вызывает конструкторы. Также бесплатно освобождает память. Удалить освобождает память и вызывает деструктор.
Слово предупреждения: не смешивайте две идиомы. Результаты: undefined.
Основное различие между new и malloc я могу вспомнить, так это то, что вы не можете перераспределять память, выделенную новым, используя realloc. Поэтому, если вы хотели увеличить/уменьшить размер блока памяти, вам пришлось выделить новый блок и скопировать все.
Calloc позволяет вам инициализировать блок памяти, который вы выделяете, в то время как malloc не делает.
Когда вы новый объект, пространство для объекта не только выделяется, но вызывается конструктор объекта. Но это способ С++, который он сделал, malloc - это старая версия в C выделения памяти. calloc совпадает с malloc, за исключением того, что он очищает память до всех битов 0.