Пространства имён
Варианты
Действия

std::malloc

Материал из cppreference.com
< cpp‎ | memory‎ | c
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
Определено в заголовочном файле <cstdlib>
void* malloc( std::size_t size );

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

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

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

Содержание

[править] Параметры

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

[править] Возвращаемое значение

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

В случае ошибки возвращается нулевой указатель.

[править] Примечание

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

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

[править] Пример

#include <iostream>   
#include <cstdlib> 
#include <string>
#include <memory>
 
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);
    }
}

Вывод:

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

[править] Смотрите также

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