«new/delete» - это ключевые слова на языке C++ (например, «for» и «while»), тогда как malloc/calloc - это вызовы функций в стандартной библиотеке C (например, «printf» и «sleep»). Очень разные звери, больше, чем их аналогичный синтаксис.
Основное отличие состоит в том, что «новый» и «удалить» запускают дополнительный код пользователя - в частности, конструкторы и деструкторы. Все malloc делает выделение памяти для вас.При отмене памяти для простых простых старых данных (например, float или ints), «новый» и «malloc» ведут себя очень похоже. Но когда вы запрашиваете место для класса, «новое» ключевое слово выделяет память, а затем вызывает конструктор для инициализации этого класса. Большая разница.
Не можете ли вы переопределить операторы 'new' и' delete', чтобы они * не * делали это (т. Е. Для одиночных чисел)? (Я новичок на C++). – dreamlax
По умолчанию 'new' заканчивается примерно следующим образом: ' Foo * pNewFoo = (static_cast (malloc (sizeof (Foo))) -> Foo(); ' Также имейте в виду, что не требуется исключений в ответ на неудачные выделения. Синтаксис 'new' выглядит намного более чистым для меня. –
JonM
Теперь, когда мы находимся на нем, он немного сложнее:' Foo * p = new (malloc (sizeof (Foo)) Foo (); ', где' new (ptr) Type' в выражении называется * placement-new * и на самом деле является вызовом конструктора (код пользователя не может напрямую вызвать конструктор) –