Андрей
Высший разум
(466199)
7 месяцев назад
При использовании new проверяется совместимость типов при присваивании возвращённого new указателя и производится автоматический вызов конструкторов при создании объектов или массивов объектов.
При использовании malloc тупо выделяется кусок памяти запрошенного размера и возвращается нетипизированный указатель (тип void*) на этот кусок памяти, содержащий непредсказуемый мусор. Вся ответственность за то, что этот указатель будет приведён к нужному типу, размера запрошенного тобой участка памяти хватит для размещения твоих данных и выделенная память будет правильно инициализирована, полностью перекладывается на тебя; компилятор ничего и никак не проверяет.
Тимур АбдрахимовУченик (104)
7 месяцев назад
спасибо, а есть ли какой то смысл в нынешнее время использовать malloc, или он является устаревшим?
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 обычно используется для устаревшего кода или в ситуациях, когда требуется более тонкий контроль над управлением памятью.