std:: malloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<cstdlib>
|
||
|
void
*
malloc
(
std::
size_t
size
)
;
|
||
Выделяет size байт неинициализированной памяти.
Если выделение памяти завершается успешно, возвращает указатель на самый младший (первый) байт в выделенном блоке памяти, который подходит для выравнивания любого скалярного типа (по крайней мере так же строго, как std::max_align_t ) ( неявно создавая объекты в области назначения).
Если size равен нулю, поведение определяется реализацией (может быть возвращен нулевой указатель, или может быть возвращен некоторый ненулевой указатель, который не может быть использован для доступа к памяти, но должен быть передан в std::free ).
|
Следующие функции должны быть потокобезопасными:
Вызовы этих функций, которые выделяют или освобождают определенную единицу памяти, происходят в едином общем порядке, и каждый такой вызов освобождения happens-before следующего выделения (если таковое имеется) в этом порядке. |
(since C++11) |
Содержание |
Параметры
| size | - | количество байт для выделения |
Возвращаемое значение
При успешном выполнении возвращает указатель на начало вновь выделенной памяти. Чтобы избежать утечки памяти, возвращаемый указатель должен быть освобожден с помощью std::free() или std::realloc() .
При неудаче возвращает нулевой указатель.
Примечания
Эта функция не вызывает конструкторы и не инициализирует память каким-либо образом. Не существует готовых умных указателей, которые могли бы гарантировать вызов соответствующей функции освобождения памяти. Предпочтительным методом выделения памяти в C++ является использование готовых к RAII функций std::make_unique , std::make_shared , конструкторов контейнеров и т.д., а в низкоуровневом библиотечном коде — new-expression .
Для загрузки больших файлов отображение файлов в память с помощью специфичных для ОС функций, например
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
|
|