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
| |