std:: malloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el encabezado
<cstdlib>
|
||
|
void
*
malloc
(
std::
size_t
size
)
;
|
||
Asigna size bytes de almacenamiento no inicializado.
Si la asignación tiene éxito, devuelve un puntero al byte más bajo (primero) en el bloque de memoria asignado que está adecuadamente alineado para cualquier tipo escalar (al menos tan estrictamente como std::max_align_t ) ( creando implícitamente objetos en el área de destino).
Si size es cero, el comportamiento está definido por la implementación (puede devolverse un puntero nulo, o puede devolverse algún puntero no nulo que no puede utilizarse para acceder al almacenamiento, pero debe pasarse a std::free ).
|
Las siguientes funciones deben ser seguras para hilos (thread-safe):
Las llamadas a estas funciones que asignan o liberan una unidad particular de almacenamiento ocurren en un único orden total, y cada llamada de liberación happens-before la siguiente asignación (si existe) en este orden. |
(desde C++11) |
Contenidos |
Parámetros
| size | - | número de bytes a asignar |
Valor de retorno
En caso de éxito, devuelve el puntero al inicio de la memoria recién asignada. Para evitar una fuga de memoria, el puntero devuelto debe ser liberado con std::free() o std::realloc() .
En caso de fallo, devuelve un puntero nulo.
Notas
Esta función no llama a constructores ni inicializa memoria de ninguna manera. No hay punteros inteligentes listos para usar que puedan garantizar que se llame a la función de desasignación correspondiente. El método preferido de asignación de memoria en C++ es utilizar funciones listas para RAII std::make_unique , std::make_shared , constructores de contenedores, etc, y, en código de biblioteca de bajo nivel, new-expression .
Para cargar un archivo grande, el mapeo de archivos mediante funciones específicas del sistema operativo, por ejemplo
mmap
en POSIX o
CreateFileMapping
(
A
/
W
) junto con
MapViewOfFile
en Windows, es preferible a asignar un búfer para la lectura de archivos.
Ejemplo
#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); } }
Salida:
p[0] == aaaaa p[1] == bbbbb p[2] == ccccc p[3] == ddddd
Véase también
|
funciones de asignación
(función) |
|
|
(obsoleto en C++17)
(eliminado en C++20)
|
obtiene almacenamiento no inicializado
(plantilla de función) |
|
Documentación de C
para
malloc
|
|