Namespaces
Variants

std:: malloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовочном файле <cstdlib>
void * malloc ( std:: size_t size ) ;

Выделяет size байт неинициализированной памяти.

Если выделение памяти завершается успешно, возвращает указатель на самый младший (первый) байт в выделенном блоке памяти, который подходит для выравнивания любого скалярного типа (по крайней мере так же строго, как std::max_align_t ) ( неявно создавая объекты в области назначения).

Если size равен нулю, поведение определяется реализацией (может быть возвращен нулевой указатель, или может быть возвращен некоторый ненулевой указатель, который не может быть использован для доступа к памяти, но должен быть передан в std::free ).

Следующие функции должны быть потокобезопасными:

Вызовы этих функций, которые выделяют или освобождают определенную единицу памяти, происходят в едином общем порядке, и каждый такой вызов освобождения happens-before следующего выделения (если таковое имеется) в этом порядке.

(since C++11)

Содержание

Параметры

size - количество байт для выделения

Возвращаемое значение

При успешном выполнении возвращает указатель на начало вновь выделенной памяти. Чтобы избежать утечки памяти, возвращаемый указатель должен быть освобожден с помощью std::free() или std::realloc() .

При неудаче возвращает нулевой указатель.

Примечания

Эта функция не вызывает конструкторы и не инициализирует память каким-либо образом. Не существует готовых умных указателей, которые могли бы гарантировать вызов соответствующей функции освобождения памяти. Предпочтительным методом выделения памяти в C++ является использование готовых к RAII функций std::make_unique , std::make_shared , конструкторов контейнеров и т.д., а в низкоуровневом библиотечном коде — new-expression .

Для загрузки больших файлов отображение файлов в память с помощью специфичных для ОС функций, например mmap в POSIX или CreateFileMapping ( A / W ) вместе с MapViewOfFile в Windows, предпочтительнее выделения буфера для чтения файла.

Пример

#include <cstdlib> 
#include <iostream>   
#include <memory>
#include <string>
int main() 
{
    constexpr std::size_t size = 4;
    if (auto ptr = reinterpret_cast<std::string*>(std::malloc(size * sizeof(std::string)))
    {
        try
        {
            for (std::size_t i = 0; i < size; ++i)
                std::construct_at(ptr + i, 5, 'a' + i);
            for (std::size_t i = 0; i < size; ++i)
                std::cout << "ptr[" << i << "] == " << ptr[i] << '\n';
            std::destroy_n(ptr, size);
        }
        catch (...) {}
        std::free(ptr);
    }
}

Вывод:

p[0] == aaaaa
p[1] == bbbbb
p[2] == ccccc
p[3] == ddddd

Смотрите также

функции выделения памяти
(функция)
(устарело в C++17) (удалено в C++20)
получает неинициализированную память
(шаблон функции)