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

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

(с 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/w/cpp/memory/c/malloc

Spec-Zone.ru

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