Spec-Zone.ru › C++

std::malloc

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

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

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

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

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

  • Версии библиотечных функций operator new и operator delete
  • Пользовательские версии глобальных функций operator new и operator delete
  • std::calloc, std::malloc, std::realloc, std::aligned_alloc(начиная с C++17), std::free

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

(начиная с C++11)

Параметры

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

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

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

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

Примечания

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

Для загрузки большого файла предпочтительнее использовать отображение файла в память с помощью специфичных для ОС функций, например, 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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/c/malloc

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API