std::malloc
Определено в заголовке <cstdlib> | ||
|---|---|---|
void* malloc( std::size_t size ); |
Выделяет size байта неинициализированного хранилища.
Если выделение выполнено успешно, возвращает указатель на самый низкий (первый) байт в выделенном блоке памяти, который должным образом выровнен для любого скалярного типа (по крайней мере, так же строго, как std::max_align_t) (неявное создание объектов в целевом участке).
Если size равно нулю, поведение определяется реализацией (может быть возвращен нулевой указатель или какой-то ненулевой указатель, который может не использоваться для доступа к хранилищу, но должен передаваться в 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
См. также
| функции выделения (функция) |
|
|
(устарело в 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