Namespaces
Variants

std:: malloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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)