Работали ли вы с функцией malloc?

«Работали ли вы с функцией malloc?» — вопрос из категории Управление памятью, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, работал, в основном в коде на чистом C или при интеграции с C-библиотеками. malloc выделяет неинициализированную память в куче и возвращает void*.

Базовый пример использования:

#include <stdlib.h>

int* create_int_array(size_t size) {
    // Выделяем память под массив из `size` целых чисел
    int* arr = (int*)malloc(size * sizeof(int));
    if (arr == NULL) {
        // Критически важно проверять на NULL
        fprintf(stderr, "Ошибка выделения памятиn");
        exit(EXIT_FAILURE);
    }
    // Память содержит "мусор", нужно инициализировать
    for (size_t i = 0; i < size; ++i) {
        arr[i] = 0;
    }
    return arr;
}
// ...
free(arr); // Обязательное освобождение

Ключевые отличия от new в C++:

  1. malloc не вызывает конструкторы объектов, new — вызывает.
  2. malloc требует явного приведения типа.
  3. free не вызывает деструкторы, delete — вызывает.

В современном C++ я предпочитаю использовать new/delete для одиночных объектов, а для массивов — std::vector или умные указатели (std::unique_ptr, std::shared_ptr), которые автоматически управляют памятью и безопаснее.