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