Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Чем отличается new от malloc в c++, помимо того что malloc является наследием языка C?

Тимур Абдрахимов Ученик (104), закрыт 7 месяцев назад
Лучший ответ
Андрей Высший разум (466199) 7 месяцев назад
При использовании new проверяется совместимость типов при присваивании возвращённого new указателя и производится автоматический вызов конструкторов при создании объектов или массивов объектов.

При использовании malloc тупо выделяется кусок памяти запрошенного размера и возвращается нетипизированный указатель (тип void*) на этот кусок памяти, содержащий непредсказуемый мусор. Вся ответственность за то, что этот указатель будет приведён к нужному типу, размера запрошенного тобой участка памяти хватит для размещения твоих данных и выделенная память будет правильно инициализирована, полностью перекладывается на тебя; компилятор ничего и никак не проверяет.
Тимур АбдрахимовУченик (104) 7 месяцев назад
спасибо, а есть ли какой то смысл в нынешнее время использовать malloc, или он является устаревшим?
Андрей Высший разум (466199) Тимур Абдрахимов, В С++ - использовать malloc нет никакого смысла. Более того, и new в С++ требуется использовать крайне редко. Вместо голых указателей намного надёжнее использовать входящие в стандартную библиотеку умные указатели https://habr.com/ru/companies/piter/articles/706866/ и контейнеры (vector, map, set и т.д.).
Тимур АбдрахимовУченик (104) 7 месяцев назад
спасибо большое вам
Остальные ответы
Chat GPT-4 Мудрец (16858) 7 месяцев назад
new и malloc в C++ являются двумя способами динамического выделения памяти, но между ними есть несколько важных отличий:

1. Управление памятью:

• malloc: Функция malloc выделяет неинициализированный блок памяти. Разработчик должен вручную инициализировать память перед ее использованием.
• new: Оператор new выделяет память и автоматически инициализирует ее значением по умолчанию для данного типа данных.

2. Оператор разыменования:

• malloc: Возвращает указатель типа void, который необходимо привести к нужному типу данных перед использованием.
• new: Возвращает указатель на объект нужного типа данных без необходимости приведения.

3. Перегрузка оператора:

• malloc: Не может быть перегружен.
• new: Может быть перегружен для пользовательских типов данных, что позволяет настраивать поведение выделения памяти.

4. Управление памятью после использования:

• malloc: Необходимо вручную освободить выделенную память с помощью функции free.
• new: Оператор delete автоматически освобождает выделенную память, что упрощает управление памятью.

5. Исключения:

• malloc: Не генерирует исключения при неудачном выделении памяти.
• new: Генерирует исключение std::bad_alloc при неудачном выделении памяти.

6. Производительность:

• malloc: Обычно немного быстрее, чем new, поскольку он не выполняет инициализацию памяти.

Когда использовать new и malloc:

• malloc: Предпочтительно использовать для выделения памяти для больших блоков данных или когда требуется точный контроль над управлением памятью.
• new: Предпочтительно использовать для выделения памяти для объектов классов или для небольших блоков данных, где удобство и безопасность более важны, чем производительность.

В целом, new является более современным и безопасным способом выделения памяти в C++, а malloc обычно используется для устаревшего кода или в ситуациях, когда требуется более тонкий контроль над управлением памятью.
Demon On Wheels Просветленный (30804) 7 месяцев назад
new вызывает конструктор
можно написать свой new
Похожие вопросы