La asignación dinámica de memoria en C se refiere a la gestión manual de la memoria para la asignación dinámica de memoria en el lenguaje de programación C a través de un grupo de funciones en la biblioteca estándar de C , principalmente malloc, realloc, calloc, aligned_allocy free. [ 1 ] [ 2 ] [ 3 ]
El lenguaje de programación C++ incluye estas funciones; sin embargo, los operadores new y delete proporcionan una funcionalidad similar y son recomendados por los autores de ese lenguaje. [ 4 ] Aun así, existen varias situaciones en las que el uso de / no es aplicable, como en el código de recolección de basura o en el código crítico para el rendimiento, y puede ser necesaria una combinación de y en lugar del operador de nivel superior.newdeletemallocnewnew
Existen diversas implementaciones del mecanismo de asignación de memoria utilizado por malloc . Su rendimiento varía tanto en tiempo de ejecución como en la memoria requerida.
Razón fundamental
El lenguaje de programación C gestiona la memoria de forma estática , automática o dinámica . Las variables de duración estática se asignan en la memoria principal, generalmente junto con el código ejecutable del programa, y persisten durante toda la vida útil del programa; las variables de duración automática se asignan en la pila y aparecen y desaparecen a medida que se llaman y finalizan las funciones. Para las variables de duración estática y automática, el tamaño de la asignación debe ser constante en tiempo de compilación (excepto en el caso de los arreglos automáticos de longitud variable [ 5 ] ). Si el tamaño requerido no se conoce hasta el tiempo de ejecución (por ejemplo, si se leen datos de tamaño arbitrario del usuario o de un archivo de disco), entonces el uso de objetos de datos de tamaño fijo es inadecuado.
La duración de la memoria asignada también puede generar preocupación. Ni la memoria de duración estática ni la de duración automática son adecuadas para todas las situaciones. Los datos asignados automáticamente no pueden persistir entre múltiples llamadas a funciones, mientras que los datos estáticos persisten durante toda la ejecución del programa, se necesiten o no. En muchas situaciones, el programador requiere mayor flexibilidad para gestionar la duración de la memoria asignada.
Estas limitaciones se evitan mediante la asignación dinámica de memoria , en la que la memoria se gestiona de forma más explícita (pero más flexible), normalmente asignándola desde el montón (almacenamiento libre), un área de memoria estructurada para este fin. En C, mallocse utiliza la función de la biblioteca para asignar un bloque de memoria en el montón. El programa accede a este bloque de memoria mediante un puntero que mallocdevuelve un valor. Cuando la memoria ya no es necesaria, el puntero se pasa a freela función que la libera para que pueda utilizarse para otros fines.
La descripción original de C indicaba que callocy cfreeestaban en la biblioteca estándar, pero no . Se proporcionó malloccódigo para una implementación de modelo simple de un administrador de almacenamiento para Unixalloc con y freecomo funciones de interfaz de usuario, y utilizando la sbrkllamada al sistema para solicitar memoria al sistema operativo. [ 6 ] La documentación de Unix de la 6.ª edición proporciona allocy freecomo funciones de asignación de memoria de bajo nivel. [ 7 ] Las rutinas mallocy freeen su forma moderna se describen completamente en el manual de Unix de la 7.ª edición. [ 8 ] [ 9 ]
Algunas plataformas proporcionan llamadas a funciones de biblioteca o intrínsecas que permiten la asignación dinámica en tiempo de ejecución desde la pila de C en lugar del montón (por ejemplo, alloca()[ 10 ] ). Esta memoria se libera automáticamente cuando finaliza la función que realiza la llamada.
Descripción general de las funciones
Las funciones de asignación dinámica de memoria de C se definen en <stdlib.h>el encabezado ( <cstdlib>encabezado en C++). [ 1 ]
Diferencias entre malloc()ycalloc()
malloc()toma un solo argumento (la cantidad de memoria a asignar en bytes), mientras quecalloc()toma dos argumentos : el número de elementos y el tamaño de cada elemento.malloc()solo asigna memoria, mientras quecalloc()asigna y establece los bytes en la región asignada a cero. [ 11 ]
Ejemplo de uso
Crear un array de diez enteros con ámbito automático es sencillo en C:
int a [ 10 ];Sin embargo, el tamaño del array es fijo en tiempo de compilación. Si se desea asignar un array similar dinámicamente sin usar un array de longitud variable , que no está garantizado que sea compatible en todas las implementaciones de C11 , se puede asignar un array usando malloc, que devuelve un puntero void (lo que indica que es un puntero a una región de tipo de datos desconocido), que se puede convertir para mayor seguridad .
int * a = ( int * ) malloc ( 10 * sizeof ( int ));Esto calcula la cantidad de bytes que ocupan diez enteros en la memoria, luego solicita esa cantidad de bytes mallocy asigna el resultado a un puntero llamado a(debido a la sintaxis de C, los punteros y las matrices se pueden usar indistintamente en algunas situaciones).
Dado que mallocpodría no ser capaz de atender la solicitud, podría devolver un puntero nulo y es una buena práctica de programación comprobar esto:
int * a = ( int * ) malloc ( 10 * sizeof ( int )); if ( ! a ) { fprintf ( stderr , "malloc falló \n " ); return -1 ; }Cuando el programa ya no necesita el array dinámico , eventualmente debe llamar freea la función para devolver la memoria que ocupa al almacenamiento libre:
libre ( a );La memoria reservada por mallocno está inicializada y puede contener datos residuales : restos de datos previamente utilizados y descartados. Después de la asignación con malloc, los elementos del array son variables no inicializadas . El comando callocdevolverá una asignación que ya ha sido liberada:
int * a = ( int * ) calloc ( 10 , sizeof ( int ));Con realloc podemos redimensionar la cantidad de memoria a la que apunta un puntero. Por ejemplo, si tenemos un puntero que actúa como un array de tamañoy queremos cambiarlo a una matriz de tamaño, podemos usar realloc.
int * a = ( int * ) malloc ( 2 * sizeof ( int )); a [ 0 ] = 1 ; a [ 1 ] = 2 ; a = ( int * ) realloc ( a , 3 * sizeof ( int )); a [ 2 ] = 3 ;Tenga en cuenta que se debe asumir que realloc ha cambiado la dirección base del bloque (es decir, si no ha podido ampliar el tamaño del bloque original y, por lo tanto, ha asignado un nuevo bloque más grande en otra ubicación y ha copiado el contenido antiguo en él). Por consiguiente, cualquier puntero a direcciones dentro del bloque original ya no es válido.
Seguridad de tipo
Como se indicó anteriormente, mallocdevuelve un puntero void ( void*), lo que indica que es un puntero a una región de tipo de datos desconocido. El uso de conversiones de tipo es necesario en C++ debido al sistema de tipos estricto, mientras que esto no ocurre en C. Se puede "convertir" (véase conversión de tipos ) este puntero a un tipo específico:
// sin una conversión int * ptr1 = malloc ( 10 * sizeof ( * ptr ));// con una conversión int * ptr2 = ( int * ) malloc ( 10 * sizeof ( * ptr ));Existen ventajas y desventajas al realizar dicha conversión. Incluir la conversión mejora la interoperabilidad entre C y C++, permitiendo que el código C se compile o utilice como C++. Además, la conversión permite versiones anteriores a 1989 que mallocoriginalmente devolvían un char*. [ 12 ] Adicionalmente, la conversión puede ayudar al desarrollador a identificar inconsistencias en el tamaño del tipo si el tipo del puntero de destino cambia, particularmente si el puntero se declara lejos de la malloc()llamada (aunque los compiladores modernos y los analizadores estáticos pueden advertir sobre tal comportamiento sin requerir la conversión [ 13 ] ).
Sin embargo, según el estándar C, la conversión no es necesaria, y agregar la conversión puede enmascarar la falta de inclusión del encabezado <stdlib.h>, en el que se encuentra el prototipo de la función para . [ 12 ] [ 14 ] En ausencia de un prototipo para , el estándar C90 requiere que el compilador C asuma que devuelve un . Si no hay conversión, C90 requiere un diagnóstico cuando este entero se asigna al puntero; sin embargo, con la conversión, este diagnóstico no se produciría, ocultando un error. En ciertas arquitecturas y modelos de datos (como LP64 en sistemas de 64 bits, donde los punteros y son de 64 bits y es de 32 bits), este error puede resultar en un comportamiento indefinido, ya que la función declarada implícitamente devuelve un valor de 32 bits, mientras que la función definida realmente devuelve un valor de 64 bits. Dependiendo de las convenciones de llamada y la disposición de la memoria, esto puede resultar en un desbordamiento de pila . Es menos probable que este problema pase desapercibido en los compiladores modernos, ya que C99 no permite declaraciones implícitas, por lo que el compilador debe generar un diagnóstico incluso si asume que se devolverá un valor. Además, si se cambia el tipo del puntero en su declaración, las líneas donde se llama a la función y la conversión de tipo también deberán actualizarse.mallocmallocmallocintlongintmallocintmalloc
En C++, si std::malloces necesario usarlo, es preferible static_casthacerlo en lugar de usar una conversión directa:
int * p = static_cast < int *> ( malloc ( 10 * sizeof ( * ptr )));Errores comunes
El uso inadecuado de la asignación dinámica de memoria puede ser frecuentemente una fuente de errores. Estos pueden incluir fallos de seguridad o bloqueos del programa, generalmente debido a errores de segmentación .
Los errores más comunes son los siguientes: [ 15 ]
- No se comprueban los fallos de asignación.
- No se garantiza que la asignación de memoria sea exitosa, y en su lugar puede devolver un puntero nulo. Usar el valor devuelto sin comprobar si la asignación fue exitosa provoca un comportamiento indefinido . Esto generalmente conduce a un fallo (debido al error de segmentación resultante al desreferenciar el puntero nulo), pero no hay garantía de que ocurra un fallo, por lo que confiar en ello también puede generar problemas.
- fugas de memoria
- Si no se libera la memoria,
freese acumula memoria no reutilizable que el programa ya no utiliza. Esto supone un desperdicio de recursos de memoria y puede provocar fallos de asignación cuando estos recursos se agotan. - Errores lógicos
- Todas las asignaciones deben seguir el mismo patrón: asignación usando
malloc, uso para almacenar datos, liberación usandofree. Los fallos que no se adhieren a este patrón, como el uso de memoria después de una llamada afree( puntero colgante ) o antes de una llamada amalloc( puntero salvaje ), llamarfreedos veces ("doble liberación"), etc., generalmente causan un fallo de segmentación y dan como resultado un bloqueo del programa. Estos errores pueden ser transitorios y difíciles de depurar; por ejemplo, la memoria liberada generalmente no es reclamada inmediatamente por el sistema operativo, por lo que los punteros colgantes pueden persistir durante un tiempo y parecer funcionar.
Además, como una interfaz que precede a la estandarización ANSI C, mallocy sus funciones asociadas tienen comportamientos que intencionalmente se dejaron a la implementación para que los defina por sí mismos. Uno de ellos es la asignación de longitud cero, que es más problemática reallocya que es más común redimensionar a cero. [ 16 ] Aunque tanto POSIX como la Especificación Única de Unix requieren un manejo adecuado de las asignaciones de tamaño 0 ya sea devolviendo NULLo algo más que se pueda liberar de forma segura, [ 17 ] no todas las plataformas están obligadas a cumplir estas reglas. Entre los muchos errores de doble liberación que ha provocado, el RCE de WhatsApp de 2019 fue especialmente prominente. [ 18 ] Una forma de envolver estas funciones para hacerlas más seguras es simplemente comprobar las asignaciones de tamaño 0 y convertirlas en asignaciones de tamaño 1. (Devolver NULLtiene sus propios problemas: de lo contrario indica un fallo de falta de memoria. En el caso de reallochabría señalado que la memoria original no se movió y liberó, lo cual de nuevo no es el caso para el tamaño 0, lo que lleva a la doble liberación). [ 19 ]
Implementaciones
La implementación de la gestión de memoria depende en gran medida del sistema operativo y la arquitectura. Algunos sistemas operativos proporcionan un asignador para malloc, mientras que otros proporcionan funciones para controlar ciertas regiones de datos. El mismo asignador de memoria dinámica se suele utilizar para implementar tanto malloc malloccomo el operador newen C++ . [ 20 ]
Basado en montón
La implementación de los asignadores heredados se realizaba comúnmente utilizando el segmento de montón . El asignador generalmente expandía y contraía el montón para satisfacer las solicitudes de asignación.
El método del montón adolece de algunos defectos inherentes:
- Un asignador lineal solo puede reducir su tamaño si se libera la última asignación. Incluso si no se usa en gran medida, el montón puede "atascarse" con un tamaño muy grande debido a una asignación pequeña pero de larga duración en su extremo, lo que podría desperdiciar cualquier cantidad de espacio de direcciones, aunque algunos asignadores en algunos sistemas pueden liberar páginas intermedias completamente vacías al sistema operativo.
- Un asignador lineal es sensible a la fragmentación . Un buen asignador intentará rastrear y reutilizar los espacios libres en todo el montón, pero a medida que se mezclan los tamaños y la duración de las asignaciones, puede resultar difícil y costoso encontrar o fusionar segmentos libres lo suficientemente grandes como para albergar nuevas solicitudes de asignación.
- Un asignador lineal tiene características de concurrencia extremadamente deficientes, ya que el segmento de montón es por proceso y cada hilo tiene que sincronizarse en la asignación, y las asignaciones concurrentes de hilos que pueden tener cargas de trabajo muy diferentes amplifican los dos problemas anteriores.
dlmalloc y ptmalloc
Doug Lea desarrolló el programa de dominio público dlmalloc ("Malloc de Doug Lea") como un asignador de propósito general, a partir de 1987. La biblioteca GNU C (glibc) deriva de ptmalloc ("pthreads malloc") de Wolfram Gloger, una bifurcación de dlmalloc con mejoras relacionadas con subprocesos. [ 21 ] [ 22 ] [ 23 ] A noviembre de 2023, la última versión de dlmalloc es la versión 2.8.6 de agosto de 2012. En 2023 se cambió su licencia de CC0 a MIT-0 . [ 24 ]
dlmalloc es un asignador de etiquetas de límite. La memoria en el montón se asigna como "fragmentos", una estructura de datos alineada de 8 bytes que contiene una cabecera y memoria utilizable. La memoria asignada contiene una sobrecarga de 8 o 16 bytes para el tamaño del fragmento y las banderas de uso (similar a un vector dope ). Los fragmentos no asignados también almacenan punteros a otros fragmentos libres en el área de espacio utilizable, lo que hace que el tamaño mínimo del fragmento sea de 16 bytes en sistemas de 32 bits y de 24/32 (depende de la alineación) bytes en sistemas de 64 bits. [ 22 ] [ 24 ] : 2.8.6, Tamaño mínimo asignado
La memoria no asignada se agrupa en " contenedores " de tamaños similares, implementados mediante una lista doblemente enlazada de fragmentos (con punteros almacenados en el espacio no asignado dentro del fragmento). Los contenedores se ordenan por tamaño en tres clases: [ 22 ] [ 24 ] : Estructuras de datos superpuestas
- Para solicitudes inferiores a 256 bytes (solicitudes de "pequeño contenedor"), se utiliza un asignador de bloques de tamaño reducido con una potencia de dos. Si no hay bloques libres en ese contenedor, se divide en dos un bloque del siguiente contenedor de mayor tamaño.
- Para solicitudes de 256 bytes o más, pero por debajo del umbral de mmap , dlmalloc, desde la versión 2.8.0, utiliza un algoritmo de trie bit a bit in situ ("treebin"). Si no queda espacio libre para satisfacer la solicitud, dlmalloc intenta aumentar el tamaño del montón, generalmente mediante la llamada al sistema brk . Esta característica se introdujo mucho después de la creación de ptmalloc (a partir de la versión 2.7.x) y, por lo tanto, no forma parte de glibc, que hereda el antiguo asignador de mejor ajuste.
- Para las solicitudes que superan el umbral de mmap (una solicitud "largebin"), la memoria siempre se asigna mediante la llamada al sistema mmap . El umbral suele ser de 128 KB. [ 25 ] El método mmap evita problemas con búferes enormes que capturan una pequeña asignación al final después de su expiración, pero siempre asigna una página completa de memoria, que en muchas arquitecturas tiene un tamaño de 4096 bytes. [ 26 ]
El desarrollador de videojuegos Adrian Stone argumenta que dlmalloc, como asignador de etiquetas de límite, no es adecuado para sistemas de consola que tienen memoria virtual pero no paginación bajo demanda . Esto se debe a que sus funciones de devolución de llamada para reducir y aumentar el tamaño del grupo ( sysmalloc/ systrim) no se pueden usar para asignar y confirmar páginas individuales de memoria virtual. En ausencia de paginación bajo demanda, la fragmentación se convierte en una preocupación mayor. [ 27 ]
jemalloc de FreeBSD y NetBSD
Desde FreeBSD 7.0 y NetBSD 5.0, la antigua mallocimplementación ( phkmallocde Poul-Henning Kamp ) fue reemplazada por jemalloc , escrita por Jason Evans. La razón principal fue la falta de escalabilidad phkmallocen términos de multihilo. Para evitar la contención de bloqueos, jemallocutiliza "áreas" separadas para cada CPU . Los experimentos que miden el número de asignaciones por segundo en aplicaciones multihilo han demostrado que esto hace que escale linealmente con el número de hilos, mientras que para phkmalloc y dlmalloc el rendimiento era inversamente proporcional al número de hilos. [ 28 ]
malloc de OpenBSD
La implementación de OpenBSDmalloc de la función utiliza mmap . Para solicitudes de mayor tamaño que una página, se recupera toda la asignación utilizando mmap; los tamaños más pequeños se asignan desde grupos de memoria mantenidos por mallocdentro de un número de "páginas de cubo", también asignadas con mmap. [ 29 ] En una llamada a , la memoria se libera y se desmapea del espacio de direcciones del proceso utilizando . Este sistema está diseñado para mejorar la seguridad aprovechando la aleatorización del diseño del espacio de direcciones y las características de página de hueco implementadas como parte de la llamada al sistema de OpenBSD , y para detectar errores de uso después de la liberación: como una asignación de memoria grande se desmapea completamente después de ser liberada, el uso posterior causa una falla de segmentación y la terminación del programa.freemunmapmmap
El proyecto GrapheneOS comenzó inicialmente portando el asignador de memoria de OpenBSD a la biblioteca Bionic C de Android. [ 30 ]
Acumular malloc
Hoard es un asignador cuyo objetivo es lograr un rendimiento de asignación de memoria escalable. Al igual que el asignador de OpenBSD, Hoard utiliza mmapexclusivamente memoria, pero la gestiona en bloques de 64 kilobytes llamados superbloques. El montón de Hoard se divide lógicamente en un único montón global y varios montones por procesador. Además, existe una caché local de hilo que puede almacenar un número limitado de superbloques. Al asignar solo desde los superbloques en el montón local por hilo o por procesador, y mover los superbloques casi vacíos al montón global para que puedan ser reutilizados por otros procesadores, Hoard mantiene la fragmentación baja a la vez que logra una escalabilidad casi lineal con el número de hilos. [ 31 ]
mimalloc
Un asignador de memoria compacto de propósito general de código abierto de Microsoft Research con enfoque en el rendimiento. [ 32 ] La biblioteca tiene aproximadamente 11 000 líneas de código .
malloc con caché de subprocesos (tcmalloc)
Cada hilo tiene un almacenamiento local para asignaciones pequeñas. Para asignaciones grandes se pueden usar mmap o sbrk . TCMalloc , una función malloc desarrollada por Google, [ 33 ] tiene recolección de basura para el almacenamiento local de hilos inactivos. Se considera que TCMalloc es más del doble de rápido que ptmalloc de glibc para programas multihilo. [ 34 ] [ 35 ]
En el núcleo
Los núcleos de los sistemas operativos necesitan asignar memoria, al igual que los programas de aplicación. mallocSin embargo, la implementación dentro de un núcleo suele diferir significativamente de las implementaciones utilizadas por las bibliotecas de C. Por ejemplo, los búferes de memoria podrían tener que cumplir con restricciones especiales impuestas por DMA , o la función de asignación de memoria podría llamarse desde un contexto de interrupción. [ 36 ] Esto requiere una mallocimplementación estrechamente integrada con el subsistema de memoria virtual del núcleo del sistema operativo.
Sobrescribiendo malloc
Debido a que mallocy sus variantes pueden tener un fuerte impacto en el rendimiento de un programa, no es raro sobrescribir las funciones de una aplicación específica mediante implementaciones personalizadas optimizadas para los patrones de asignación de la aplicación. El estándar C no especifica una forma de hacerlo, pero los sistemas operativos han encontrado varias maneras de lograrlo aprovechando el enlace dinámico. Una forma es simplemente enlazar una biblioteca diferente para sobrescribir los símbolos. Otra, empleada por Unix System V.3 , es crear punteros malloca freefunciones que una aplicación puede restablecer a funciones personalizadas. [ 37 ]
En el código fuente la función se puede reemplazar fácilmente utilizando macros de preprocesador, como por ejemplo:
#define malloc custom_malloc #define realloc custom_realloc #define free custom_free
que se definen en un encabezado que deben incluir todos los archivos que usan funciones de asignación de memoria. Estas macros también deberían reemplazar la función strdup, ya que su resultado freetambién se pasa a . Los datos asignados dentro de las funciones de la biblioteca (como FILElas estructuras en stdio.h) todavía se manejan directamente sin usar los envoltorios.
La forma más común en sistemas tipo POSIX es establecer la variable de entorno LD_PRELOAD con la ruta del asignador, de modo que el enlazador dinámico utilice esa versión de malloc/calloc/free en lugar de la implementación de libc.
Límites de tamaño de asignación
El tamaño máximo que mallocpuede asignar un bloque de memoria depende del sistema anfitrión, en particular del tamaño de la memoria física y de la implementación del sistema operativo.
Teóricamente, el número más grande debería ser el valor máximo que puede almacenarse en un size_ttipo, que es un entero sin signo dependiente de la implementación que representa el tamaño de un área de memoria. En el estándar C99 y posteriores, está disponible como la SIZE_MAXconstante de . Aunque no está garantizado por ISO C , suele ser .<stdint.h>2^(CHAR_BIT * sizeof(size_t)) - 1
En los sistemas glibc, el bloque de memoria más grande que mallocse puede asignar es solo la mitad de este tamaño, es decir , . [ 38 ]2^(CHAR_BIT * sizeof(ptrdiff_t) - 1) - 1
En los sistemas que utilizan segmentación , como algunos modelos de memoria bajo MS-DOS , el bloque de memoria más grande posible suele ser de un segmento o menos y, por lo tanto, significativamente menor que el espacio de direcciones total, y size_tpodría ser de un tipo más pequeño que ptrdiff_t.
Extensiones y alternativas
Las implementaciones de la biblioteca C que se incluyen con diversos sistemas operativos y compiladores pueden presentar alternativas y extensiones a la mallocinterfaz estándar. Entre ellas destacan:
alloca, que asigna un número solicitado de bytes en la pila de llamadas . No existe una función de desasignación correspondiente, ya que normalmente la memoria se desasigna tan pronto como la función que llama regresa.allocaestuvo presente en los sistemas Unix ya en 32/V (1978), pero su uso puede ser problemático en algunos contextos (por ejemplo, embebidos). [ 39 ] Si bien es compatible con muchos compiladores, no es parte del estándar ANSI-C y, por lo tanto, puede que no siempre sea portable. También puede causar problemas menores de rendimiento: conduce a marcos de pila de tamaño variable, por lo que tanto los punteros de pila como los de marco deben administrarse (con marcos de pila de tamaño fijo, uno de estos es redundante). [ 40 ] Las asignaciones más grandes también pueden aumentar el riesgo de comportamiento indefinido debido a un desbordamiento de pila . [ 41 ] C99 ofreció arreglos de longitud variable como un mecanismo alternativo de asignación de pila ; sin embargo, esta característica fue relegada a opcional en el estándar C11 posterior .- POSIX define una función
posix_memalignque asigna memoria con la alineación especificada por quien la llama. Sus asignaciones se liberan confree, [ 42 ] por lo que la implementación generalmente debe ser parte de la biblioteca malloc.
Véase también
Referencias
- 1 2 7.20.3 Funciones de gestión de memoria (PDF) . Especificación ISO/IEC 9899:1999 (Informe técnico). pág. 313.
- ↑ Summit, Steve. "Capítulo 11: Asignación de memoria" . Notas de programación en C. Consultado el 11 de julio de 2020 .
- ↑ "aligned_alloc(3) - Página man de Linux" .
- ↑ Stroustrup, Bjarne (2008). Programación: Principios y práctica con C++ . Addison Wesley. pág. 1009. ISBN 978-0-321-54372-1.
- ↑ "manual de gcc" . gnu.org . Consultado el 14 de diciembre de 2008 .
- ↑ Brian W. Kernighan, Dennis M. Ritchie, El lenguaje de programación C , Prentice-Hall, 1978; la Sección 7.9 (página 156) describe
callocycfree, y la Sección 8.7 (página 173) describe una implementación paraallocyfree. - ↑ – Manual del programador de Unix, versión 6
- ↑ – Manual del programador de Unix, versión 7
- ↑ Anónimo, Manual del programador de Unix, vol. 1 , Holt Rinehart and Winston, 1983 (copyright en poder de Bell Telephone Laboratories, 1983, 1979); La
manpágina paramallocetc. se da en la página 275. - ↑ – Manual de funciones de la biblioteca de FreeBSD
- ↑ – Manual del programador de Linux – Funciones de la biblioteca de Manned.org
- 1 2 "Casting malloc" . Cprogramming.com . Consultado el 9 de marzo de 2007 .
- ↑ "clang: lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp Archivo fuente" . clang.llvm.org . Consultado el 1 de abril de 2018 .
- ↑ "comp.lang.c FAQ list · Pregunta 7.7b" . C-FAQ . Consultado el 09-03-2007 .
- ↑ Reek, Kenneth (1997-08-04). Pointers on C (1.ª ed.). Pearson. ISBN 9780673999863.
- ↑ "MEM04-C. Cuidado con las asignaciones de longitud cero - Estándar de codificación C de SEI CERT - Confluence" . wiki.sei.cmu.edu .
- ↑ "POSIX.1-2017: malloc" . pubs.opengroup.org . Consultado el 29 de noviembre de 2019 .
- ↑ Awakened (2019-10-02). "Cómo un error de doble liberación de memoria en WhatsApp se convierte en RCE" . Recuperado el 29 de noviembre de 2019 .
- ↑ Felker, Rich [@RichFelker] (3 de octubre de 2019). "Wow. La RCE de WhatsApp fue el comportamiento incorrecto para realloc(p,0) en el que insisten tantas implementaciones" ( Tweet ) . Recuperado el 6 de agosto de 2022 – vía Twitter .
- ↑ Alexandrescu, Andrei (2001). Diseño moderno de C++: Programación genérica y patrones de diseño aplicados . Addison-Wesley. pág. 78.
- ↑ "Página principal de malloc de Wolfram Gloger" . malloc.de . Consultado el 1 de abril de 2018 .
- 1 2 3 Kaempf, Michel (2001). "Vudo malloc tricks" . Phrack (57): 8. Archivado del original el 22-01-2009 . Recuperado el 29-04-2009 .
- ↑ "Glibc: Malloc Internals" . sourceware.org Trac . Consultado el 1 de diciembre de 2019 .
- 1 2 3 Lee, Doug. "Un asignador de memoria" . Recuperado el 1 de diciembre de 2019 .HTTP para código fuente
- ↑ "Parámetros ajustables de Malloc" . GNU . Consultado el 2 de mayo de 2009 .
- ↑ Sanderson, Bruce (12 de diciembre de 2004). "RAM, memoria virtual, archivo de paginación y todo eso" . Ayuda y soporte técnico de Microsoft.
- ↑ Stone, Adrian. "El agujero que dlmalloc no puede llenar" . Game Angst . Consultado el 1 de diciembre de 2019 .
- ↑ Evans, Jason (16 de abril de 2006). "Una implementación escalable y concurrente de malloc(3) para FreeBSD" (PDF) . Recuperado el 18 de marzo de 2012 .
- ↑ "libc/stdlib/malloc.c" . Referencia cruzada de BSD, OpenBSD src/lib/ .
- ↑ "Historia | GrapheneOS" . grapheneos.org . Consultado el 2 de marzo de 2023 .
- ↑ Berger, ED; McKinley, KS ; Blumofe, RD; Wilson, PR (noviembre de 2000). Hoard: Un asignador de memoria escalable para aplicaciones multihilo (PDF) . ASPLOS -IX. Actas de la novena conferencia internacional sobre soporte arquitectónico para lenguajes de programación y sistemas operativos . págs. 117–128 . CiteSeerX 10.1.1.1.4174 . doi : 10.1145/378993.379232 . ISBN 1-58113-317-0.
- ↑ "Microsoft lanza una versión optimizada de malloc() como código abierto - Slashdot" . Archivado del original el 14 de junio de 2023. Consultado el 4 de julio de 2020 .
- ↑ Página principal de TCMalloc
- ↑ Ghemawat, Sanjay; Menage, Paul; TCMalloc : Malloc de almacenamiento en caché de hilos
- ↑ Callaghan, Mark (18 de enero de 2009). "Alta disponibilidad de MySQL: duplica el rendimiento de sysbench con TCMalloc" . Mysqlha.blogspot.com . Consultado el 18 de septiembre de 2011 .
- ↑ "kmalloc()/kfree() include/linux/slab.h" . People.netfilter.org . Consultado el 18 de septiembre de 2011 .
- ↑ Levine, John R. (2000) [octubre de 1999]. «Capítulo 9: Bibliotecas compartidas». Enlazadores y cargadores . Serie Morgan Kaufmann de ingeniería de software y programación (1.ª ed.). San Francisco, EE. UU.: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382 . Consultado el 12 de enero de 2020 .
{{cite book}}: CS1 maint: servicio de archivado obsoleto ( enlace ) Código:Errata: - ↑ "malloc: hacer que malloc falle con solicitudes mayores que PTRDIFF_MAX" . Sourceware Bugzilla . 18 de abril de 2019. Consultado el 30 de julio de 2020 .
- ↑ "¿Por qué no se considera una buena práctica el uso de alloca()?" . stackoverflow.com . Consultado el 5 de enero de 2016 .
- ↑ Amarasinghe, Saman; Leiserson, Charles (2010). "6.172 Ingeniería de rendimiento de sistemas de software, Lección 10" . MIT OpenCourseWare . Instituto Tecnológico de Massachusetts. Archivado del original el 22 de junio de 2015. Consultado el 27 de enero de 2015 .
- ↑ "alloca(3) - Página del manual de Linux" . man7.org . Consultado el 5 de enero de 2016 .
- ↑ – Referencia de interfaces del sistema, Especificación única de UNIX , Versión 5 de The Open Group
Enlaces externos
- Definición de malloc en el estándar IEEE Std 1003.1
- Lea, Doug ; El diseño de la base del asignador glibc
- Gloger, Wolfram; La página de inicio de ptmalloc
- Berger, Emery; Página principal de The Hoard
- Douglas, Niall; La página principal de Nedmalloc
- Evans, Jason; La página principal de Jemalloc
- Google; La página principal de tcmalloc
- Algoritmos sencillos de asignación de memoria en la comunidad OSDEV
- Michael, Maged M.; Asignación dinámica de memoria sin bloqueo escalable
- Bartlett, Jonathan; Gestión de memoria interna : opciones, compensaciones e implementaciones de la asignación dinámica
- Página wiki de Reducción de Memoria (GNOME) con mucha información sobre cómo solucionar problemas con malloc.
- Borrador estándar C99, incluidos TC1/TC2/TC3
- Algunas referencias útiles sobre C
- ISO/IEC 9899 – Lenguajes de programación – C
- Comprender glibc malloc
- Gestión de la memoria
- Software de gestión de memoria
- Biblioteca estándar de C
- C++