std::malloc
Определено в заголовочном файле <cstdlib>
|
||
void* malloc( std::size_t size ); |
||
Выделяет size байт неинициализированной памяти.
Если выделение прошло успешно, то возвращается указатель на самый младший (первый) байт в выделенном блоке памяти, который выровнен соответствующим образом для любого скалярного типа (по крайней мере, строго как std::max_align_t) (неявно создавая объекты в области назначения).
Если size равен нулю, поведение определяется реализацией (может быть возвращён как нулевой указатель, так и ненулевой указатель, который нельзя использовать для доступа к памяти, но который должен быть передан std::free).
Содержание |
[править] Параметры
size | — | количество байт памяти для выделения |
[править] Возвращаемое значение
В случае успеха возвращает указатель на начало выделенной памяти. Чтобы избежать утечки памяти, возвращённый указатель должен быть освобождён с помощью функции std::free() или std::realloc()
.
В случае ошибки возвращается нулевой указатель.
[править] Примечание
Эта функция не вызывает конструкторы и не инициализирует память каким-либо образом. Не существует готовых к использованию умных указателей, которые могли бы гарантировать вызов соответствующей функции освобождения. Предпочтительным методом выделения памяти для C++ является использование RAII-функций std::make_unique, std::make_shared, конструкторов контейнеров и т.д., а в низкоуровневом библиотечном коде выражения new.
Для загрузки большого файла отображение файлов с помощью функций, специфичных для ОС, например, mmap
в POSIX или CreateFileMapping
(A
/W
) вместе с MapViewOfFile
в Windows предпочтительнее выделения буфера для чтения файла.
[править] Пример
#include <iostream> #include <cstdlib> #include <string> #include <memory> 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); } }
Вывод:
ptr[0] == aaaaa ptr[1] == bbbbb ptr[2] == ccccc ptr[3] == ddddd
[править] Смотрите также
функции распределения памяти (функция) | |
(не рекомендуется в C++17)(удалено в C++20) |
получает неинициализированную память (шаблон функции) |
Документация C по malloc
|