La asignación de memoria dinámica de C se refiere a realizar la administración de memoria manual para la asignación de memoria dinámica en el lenguaje de programación C a través de un grupo de funciones en la biblioteca estándar de C , a saber , malloc , realloc , calloc y 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 idioma. [4] Aún así, hay varias situaciones en las que el uso no es aplicable, como el código de recolección de basura o el código sensible al rendimiento, y puede requerirse una combinación de y en lugar del operador de nivel superior .new/delete
malloc
placement new
new
Están disponibles muchas implementaciones diferentes del mecanismo de asignación de memoria real, utilizado por malloc . Su rendimiento varía tanto en el tiempo de ejecución como en la memoria requerida.
Razón fundamental
El lenguaje de programación C administra 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 la vida útil del programa; las variables de duración automática se asignan en la pila y van y vienen a medida que se llaman y regresan las funciones. Para variables de duración estática y duración automática, el tamaño de la asignación debe ser constante en tiempo de compilación (excepto en el caso de matrices automáticas de longitud variable [5] ). Si no se conoce el tamaño requerido 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 vida útil de la memoria asignada también puede ser motivo de preocupación. Ni la memoria de duración estática ni la automática son adecuadas para todas las situaciones. Los datos asignados automáticamente no pueden persistir en múltiples llamadas a funciones, mientras que los datos estáticos persisten durante la vida útil del programa, ya sea que sean necesarios o no. En muchas situaciones, el programador requiere una mayor flexibilidad para administrar la vida útil de la memoria asignada.
Estas limitaciones se evitan mediante el uso de la asignación de memoria dinámica , en la que la memoria se gestiona de forma más explícita (pero más flexible), normalmente asignándola desde el almacén libre (informalmente llamado "montón"), un área de memoria estructurada para este propósito. En C, la función de biblioteca malloc
se usa para asignar un bloque de memoria en el montón. El programa accede a este bloque de memoria a través de un puntero que malloc
regresa. Cuando la memoria ya no es necesaria, se pasa el puntero al free
que desasigna la memoria para que pueda utilizarse para otros fines.
La descripción original de C indicó que calloc
y cfree
estaban en la biblioteca estándar, pero no malloc
. El código para una implementación de modelo simple de un administrador de almacenamiento para Unix se proporcionó con alloc
y free
como las funciones de la interfaz de usuario, y se usó la sbrk
llamada al sistema para solicitar memoria del sistema operativo. [6] La documentación de Unix de la 6ª edición proporciona alloc
y free
como funciones de asignación de memoria de bajo nivel. [7] Las rutinas malloc
y free
en su forma moderna se describen completamente en el manual de Unix de la 7ª edición. [8] [9]
Algunas plataformas proporcionan bibliotecas o llamadas a funciones 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 de llamada.
Resumen de funciones
Las funciones de asignación de memoria dinámica de C se definen en el stdlib.h
encabezado ( cstdlib
encabezado en C ++). [1]
Función | Descripción |
---|---|
malloc | asigna el número especificado de bytes |
realloc | aumenta o disminuye el tamaño del bloque de memoria especificado, moviéndolo si es necesario |
calloc | asigna el número especificado de bytes y los inicializa a cero |
free | libera el bloque de memoria especificado de nuevo al sistema |
Diferencias entre malloc()
ycalloc()
malloc()
toma un solo argumento (la cantidad de memoria para asignar en bytes), mientras quecalloc()
necesita dos argumentos (el número de variables para asignar en la memoria y el tamaño en bytes de una sola variable).malloc()
no inicializa la memoria asignada, mientrascalloc()
que garantiza que todos los bytes del bloque de memoria asignada se han inicializado a 0.- En algunos sistemas operativos,
calloc()
se puede implementar apuntando inicialmente todas las páginas de las direcciones virtuales de la memoria asignada a una página de solo lectura de todos los 0, y solo asignando páginas físicas de lectura y escritura cuando se escriben las direcciones virtuales, un método llamado copiar- en escritura .
Ejemplo de uso
Crear una matriz de diez enteros con alcance automático es sencillo en C:
int matriz [ 10 ];
Sin embargo, el tamaño de la matriz se fija en el momento de la compilación. Si se desea asignar una matriz similar de forma dinámica, se puede utilizar el siguiente código:
int * matriz = ( int * ) malloc ( 10 * tamaño de ( int ));
Esto calcula la cantidad de bytes que ocupan diez enteros en la memoria, luego solicita esa cantidad de bytes malloc
y asigna el resultado a un puntero con nombre array
(debido a la sintaxis de C, los punteros y las matrices se pueden usar indistintamente en algunas situaciones).
Debido a malloc
que es posible que no pueda atender la solicitud, es posible que devuelva un puntero nulo y es una buena práctica de programación verificar esto:
int * matriz = malloc ( 10 * tamaño de ( int )); if ( matriz == NULL ) { fprintf ( stderr , "malloc falló \ n " ); return -1 ; }
Cuando el programa ya no necesita la matriz dinámica , eventualmente debe llamar free
para devolver la memoria que ocupa a la tienda libre:
libre ( matriz );
La memoria reservada por malloc
no se inicializa y puede contener cruft : los restos de datos usados y descartados previamente. Después de la asignación con malloc
, los elementos de la matriz son variables no inicializadas . El comando calloc
devolverá una asignación que ya se ha borrado:
int * matriz = calloc ( 10 , tamaño de ( int ));
Con realloc podemos cambiar el tamaño de la cantidad de memoria a la que apunta un puntero. Por ejemplo, si tenemos un puntero que actúa como una matriz de tamaño y queremos cambiarlo a una matriz de tamaño , podemos usar realloc.
int * arr = malloc ( 2 * tamaño de ( int )); arr [ 0 ] = 1 ; arr [ 1 ] = 2 ; arr = realloc ( arr , 3 * tamaño de ( int )); arr [ 2 ] = 3 ;
Tenga en cuenta que debe asumirse que la reasignación 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 otro lugar y ha copiado el contenido antiguo en él). Por lo tanto, cualquier puntero a direcciones dentro del bloque original tampoco es válido.
Tipo de seguridad
malloc
devuelve un puntero vacío ( void *
), que indica que es un puntero a una región de tipo de datos desconocido. El uso de conversión es necesario en C ++ debido al fuerte sistema de tipos, mientras que este no es el caso en C. Uno puede "lanzar" (ver conversión de tipos ) este puntero a un tipo específico:
int * ptr ; ptr = malloc ( 10 * sizeof ( * ptr )); / * sin un reparto * / ptr = ( int * ) malloc ( 10 * sizeof ( * ptr )); / * con un yeso * /
Hay ventajas y desventajas de realizar un yeso de este tipo.
Ventajas del casting
- La inclusión de la transmisión puede permitir que un programa o función de C se compile como C ++.
- El elenco permite versiones anteriores a 1989 de
malloc
que originalmente devolvió unchar *
. [11] - La conversión puede ayudar al desarrollador a identificar inconsistencias en el tamaño del tipo si el tipo de puntero de destino cambia, particularmente si el puntero se declara lejos de la
malloc()
llamada (aunque los compiladores y analizadores estáticos modernos pueden advertir sobre tal comportamiento sin requerir la conversión [12] ).
Desventajas del casting
- Según el estándar C, el yeso es redundante.
- Adición de la fundición puede enmascarar el fracaso para incluir la cabecera
stdlib.h
, en el que el prototipo de función paramalloc
se encuentra. [11] [13] En ausencia de un prototipo paramalloc
, el estándar C90 requiere que el compilador de C asuma quemalloc
devuelve unint
. Si no hay conversión, C90 requiere un diagnóstico cuando este entero se asigna al puntero; sin embargo, con el elenco, este diagnóstico no se produciría, ocultando un error. En ciertas arquitecturas y modelos de datos (como LP64 en sistemas de 64 bits, dondelong
y los punteros son de 64 bits y deint
32 bits), este error puede resultar en un comportamiento indefinido, ya que el declarado implícitamentemalloc
devuelve un valor de 32 bits mientras que la función realmente definida devuelve un valor de 64 bits. Dependiendo de las convenciones de llamada y el diseño de la memoria, esto puede resultar en la rotura de la 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 producir un diagnóstico incluso si asume unint
retorno. - Si el tipo de puntero se cambia en su declaración, es posible que también sea necesario cambiar todas las líneas donde
malloc
se llama y se lanza.
Errores comunes
El uso indebido de la asignación de memoria dinámica a menudo puede ser una fuente de errores. Estos pueden incluir errores de seguridad o fallas del programa, la mayoría de las veces debido a fallas de segmentación .
Los errores más comunes son los siguientes: [14]
- No verificar fallas de asignación
- No se garantiza que la asignación de memoria sea correcta y, en su lugar, puede devolver un puntero nulo. El uso del valor devuelto, sin verificar si la asignación es exitosa, invoca un comportamiento indefinido . Esto generalmente conduce a un bloqueo (debido a la falla de segmentación resultante en la eliminación de referencia del puntero nulo), pero no hay garantía de que ocurra un bloqueo, por lo que confiar en eso también puede generar problemas.
- Pérdidas de memoria
- El no desasignar la memoria usando
free
conduce a la acumulación de memoria no reutilizable, que ya no es utilizada por el programa. Esto desperdicia recursos de memoria y puede provocar fallas en la asignación cuando se agotan estos recursos. - Errores lógicos
- Todas las asignaciones deben seguir el mismo patrón: uso de asignación
malloc
, uso para almacenar datos, uso de desasignaciónfree
. Las fallas en el cumplimiento de este patrón, como el uso de memoria después de una llamada afree
( puntero colgante ) o antes de una llamada amalloc
( puntero salvaje ), llamarfree
dos veces ("doble libre"), etc., generalmente causa una falla de segmentación y da como resultado una bloqueo del programa. Estos errores pueden ser transitorios y difíciles de depurar; por ejemplo, el sistema operativo no recupera inmediatamente la memoria liberada y, por lo tanto, los punteros colgantes pueden persistir durante un tiempo y parecer que funcionan.
Además, como una interfaz que precede a la estandarización ANSI C, malloc
y sus funciones asociadas tienen comportamientos que se dejaron intencionalmente 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ático realloc
ya que es más común cambiar el tamaño a cero. [15] Aunque tanto POSIX como la Especificación Única de Unix requieren un manejo adecuado de las asignaciones de tamaño 0 mediante la devolución NULL
o algo más que se pueda liberar de forma segura, [16] no todas las plataformas están obligadas a cumplir con estas reglas. Entre los muchos errores de doble libre que ha provocado, el WhatsApp RCE de 2019 fue especialmente destacado. [17] Una forma de ajustar estas funciones para hacerlas más seguras es simplemente verificando las asignaciones de tamaño 0 y convirtiéndolas en aquellas de tamaño 1. (La devolución NULL
tiene sus propios problemas: de lo contrario, indica una falla de memoria insuficiente. el caso realloc
habría señalado que la memoria original no se movió y liberó, lo que nuevamente no es el caso para el tamaño 0, lo que lleva al doble libre.) [18]
Implementaciones
La implementación de la gestión de la 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 usa a menudo para implementar tanto malloc
el operador como new
en C ++ . [19]
Basado en montón
La implementación del asignador se realiza comúnmente utilizando el montón o segmento de datos . El asignador generalmente expandirá y contraerá el montón para cumplir con las solicitudes de asignación.
El método del montón adolece de algunos defectos inherentes, que se derivan por completo de la fragmentación . Como cualquier método de asignación de memoria, el montón se fragmentará; es decir, habrá secciones de memoria usada y no usada en el espacio asignado en el montón. Un buen asignador intentará encontrar un área no utilizada de memoria ya asignada para usar antes de recurrir a expandir el montón. El principal problema con este método es que el montón tiene sólo dos atributos importantes: base o el comienzo del montón en el espacio de memoria virtual; y longitud, o su tamaño. El montón requiere suficiente memoria del sistema para ocupar toda su longitud y su base nunca puede cambiar. Por lo tanto, se desperdicia cualquier área grande de memoria no utilizada. El montón se puede "atascar" en esta posición si existe un pequeño segmento usado al final del montón, lo que podría desperdiciar cualquier cantidad de espacio de direcciones. En los esquemas de asignación de memoria diferida, como los que se encuentran a menudo en el sistema operativo Linux, un montón grande no necesariamente reserva la memoria del sistema equivalente; sólo lo hará en el momento de la primera escritura (las lecturas de las páginas de memoria no asignadas devuelven cero). La granularidad de esto depende del tamaño de la página.
dlmalloc y ptmalloc
Doug Lea ha desarrollado el dominio público dlmalloc ("Doug Lea's Malloc") como un asignador de propósito general, a partir de 1987. La biblioteca GNU C (glibc) se deriva de ptmalloc de Wolfram Gloger ("pthreads malloc"), una bifurcación de dlmalloc con mejoras relacionadas con subprocesos. [20] [21] [22] A noviembre de 2019, la última versión de dlmalloc es la versión 2.8.6 de agosto de 2012. [23]
dlmalloc es un asignador de etiquetas de límites. La memoria en el montón se asigna como "fragmentos", una estructura de datos alineada de 8 bytes que contiene un encabezado y memoria utilizable. La memoria asignada contiene una sobrecarga de 8 o 16 bytes para el tamaño del fragmento y los indicadores de uso (similar a un vector de droga ). 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. [21] [23] ( 2.8.6, tamaño mínimo asignado )
La memoria no asignada se agrupa en " bins " de tamaños similares, implementados mediante el uso de una lista de fragmentos de doble enlace (con punteros almacenados en el espacio no asignado dentro del fragmento). Los contenedores se clasifican por tamaño en tres clases: [21] [23] ( Estructuras de datos superpuestas )
- Para solicitudes por debajo de 256 bytes (una solicitud "smallbin"), se utiliza un simple asignador de mejor ajuste de dos potencias. Si no hay bloques libres en ese contenedor, un bloque del siguiente contenedor más alto se divide en dos.
- Para solicitudes de 256 bytes o más pero por debajo del umbral de mmap , dlmalloc desde v2.8.0 usa un algoritmo 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 a través de la llamada al sistema brk . Esta característica se introdujo mucho después de que se creara ptmalloc (a partir de v2.7.x) y, como resultado, no forma parte de glibc, que hereda el antiguo asignador de mejor ajuste.
- Para solicitudes por encima del umbral de mmap (una solicitud "largebin"), la memoria siempre se asigna mediante la llamada al sistema mmap . El umbral suele ser de 256 KB. [24] El método mmap evita problemas con grandes búferes que atrapan 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. [25]
El desarrollador de juegos Adrian Stone sostiene que dlmalloc
, como asignador de etiquetas de límite, es hostil para los sistemas de consola que tienen memoria virtual pero no tienen paginación por demanda . Esto se debe a que sus devoluciones de llamada de crecimiento y reducción de grupos (sysmalloc / systrim) no se pueden usar para asignar y confirmar páginas individuales de memoria virtual. En ausencia de paginación por demanda, la fragmentación se convierte en una preocupación mayor. [26]
Jemalloc de FreeBSD y NetBSD
Desde FreeBSD 7.0 y NetBSD 5.0, la antigua malloc
implementación (phkmalloc) fue reemplazada por jemalloc , escrita por Jason Evans. La razón principal de esto fue la falta de escalabilidad de phkmalloc en términos de multiproceso. Para evitar la contención de bloqueos, jemalloc usa "arenas" separadas para cada CPU . Los experimentos que miden el número de asignaciones por segundo en aplicaciones de subprocesos múltiples han demostrado que esto hace que se escale linealmente con el número de subprocesos, mientras que tanto para phkmalloc como para dlmalloc, el rendimiento fue inversamente proporcional al número de subprocesos. [27]
Malloc de OpenBSD
La implementación de OpenBSD de la malloc
función hace uso de mmap . Para solicitudes de más de una página, la asignación completa se recupera usando mmap
; los tamaños más pequeños se asignan desde grupos de memoria mantenidos por malloc
dentro de un número de "páginas de depósito", también asignados con mmap
. [28] [se necesita una fuente mejor ] En una llamada a free
, la memoria se libera y se desasigna del espacio de direcciones del proceso usando munmap
. Este sistema está diseñado para mejorar la seguridad al aprovechar las funciones de aleatorización del diseño del espacio de direcciones y de la página de brecha implementadas como parte de la mmap
llamada al sistema de OpenBSD , y para detectar errores de uso después de la liberación, ya que una gran asignación de memoria no se asigna por completo después de que se libera , el uso posterior provoca un error de segmentación y la terminación del programa.
Atesorar malloc
Hoard es un asignador cuyo objetivo es el rendimiento de la asignación de memoria escalable. Como el asignador de OpenBSD, Hoard usa mmap
exclusivamente, pero administra la memoria en trozos de 64 kilobytes llamados superbloques. El montón de Hoard está lógicamente dividido en un único montón global y varios montones por procesador. Además, hay una caché local de subprocesos que puede contener un número limitado de superbloques. Al asignar solo desde superbloques en el montón local por subproceso o por procesador, y mover superbloques en su mayoría vacíos al montón global para que puedan ser reutilizados por otros procesadores, Hoard mantiene baja la fragmentación mientras logra una escalabilidad casi lineal con el número de subprocesos . [29]
mimalloc
Un asignador de memoria de uso general compacto de código abierto de Microsoft Research que se centra en el rendimiento. [30] La biblioteca tiene unas 11.000 líneas de código .
Malloc de almacenamiento en caché de subprocesos (tcmalloc)
Cada subproceso tiene un almacenamiento local de subprocesos para asignaciones pequeñas. Para asignaciones grandes, se puede utilizar mmap o sbrk . TCMalloc , un malloc desarrollado por Google, [31] tiene recolección de basura para el almacenamiento local de hilos muertos. Se considera que TCMalloc es más del doble de rápido que ptmalloc de glibc para programas multiproceso. [32] [33]
En el kernel
Los núcleos del sistema operativo necesitan asignar memoria al igual que lo hacen los programas de aplicación. malloc
Sin embargo, la implementación dentro de un kernel a menudo difiere significativamente de las implementaciones utilizadas por las bibliotecas de C. Por ejemplo, es posible que los búferes de memoria deban ajustarse a restricciones especiales impuestas por DMA , o la función de asignación de memoria podría llamarse desde el contexto de interrupción. [34] Esto requiere una malloc
implementación estrechamente integrada con el subsistema de memoria virtual del kernel del sistema operativo.
Anulando malloc
Debido a que malloc
y sus parientes pueden tener un fuerte impacto en el rendimiento de un programa, no es raro anular las funciones para una aplicación específica mediante implementaciones personalizadas que están optimizadas para los patrones de asignación de la aplicación. El estándar C no proporciona ninguna forma de hacer esto, pero los sistemas operativos han encontrado varias formas de hacerlo aprovechando los enlaces dinámicos. Una forma es simplemente enlazar en una biblioteca diferente para anular los símbolos. Otro, empleado por Unix System V.3 , es crear malloc
y hacer free
punteros de función que una aplicación pueda restablecer a funciones personalizadas. [35]
Límites de tamaño de la asignación
El bloque de memoria más grande posible que se malloc
puede asignar depende del sistema host, particularmente el tamaño de la memoria física y la implementación del sistema operativo.
En teoría, el número más grande debería ser el valor máximo que se puede mantener en un size_t
tipo, 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_MAX
constante de
. Aunque no está garantizado por ISO C , generalmente lo está .2^(CHAR_BIT * sizeof(size_t)) - 1
En los sistemas glibc, el bloque de memoria más grande posible que se malloc
puede asignar es solo la mitad de este tamaño, es decir . [36]2^(CHAR_BIT * sizeof(ptrdiff_t) - 1) - 1
Extensiones y alternativas
Las implementaciones de la biblioteca C que se envían con varios sistemas operativos y compiladores pueden incluir alternativas y extensiones a la malloc
interfaz estándar . Entre estos se 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 regresa la función de llamada.alloca
estaba presente en los sistemas Unix ya en 32 / V (1978), pero su uso puede ser problemático en algunos contextos (por ejemplo, embebidos). [37] Aunque es compatible con muchos compiladores, no es parte del estándar ANSI-C y, por lo tanto, no siempre es portátil. 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). [38] Las asignaciones más grandes también pueden aumentar el riesgo de comportamiento indefinido debido a un desbordamiento de pila . [39] C99 ofrecía matrices de longitud variable como un mecanismo de asignación de pila alternativo; sin embargo, esta característica fue relegada a opcional en el estándar C11 posterior .- POSIX define una función
posix_memalign
que asigna memoria con la alineación especificada por el llamador. Sus asignaciones están desasignadasfree
, [40] por lo que la implementación generalmente necesita ser parte de la biblioteca malloc.
Ver también
- Desbordamiento de búfer
- Depurador de memoria
- Protección de la memoria
- Tamaño de página
- Matriz de longitud variable
Referencias
- ^ a b Especificación ISO / IEC 9899: 1999 (PDF) . pag. 313, § 7.20.3 "Funciones de gestión de memoria".
- ^ Godse, Atul P .; Godse, Deepali A. (2008). Programación C avanzada . pag. 6-28: Publicaciones técnicas. pag. 400. ISBN 978-81-8431-496-0.Mantenimiento de CS1: ubicación ( enlace )
- ^ Cumbre, Steve. "Capítulo 11: Asignación de memoria" . C Notas de programación . Consultado el 11 de julio de 2020 .
- ^ Stroustrup, Bjarne (2008). Programación: Principios y práctica con C ++ . 1009, §27.4 Tienda gratuita : Addison Wesley. pag. 1236. ISBN 978-0-321-54372-1.Mantenimiento de CS1: ubicación ( enlace )
- ^ "gcc manual" . 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
calloc
ycfree
, y la sección 8.7 (página 173) describe una implementación paraalloc
yfree
. - ^ - 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 Reinhart y Winston, 1983 (derechos de autor de Bell Telephone Laboratories, 1983, 1979); La
man
página paramalloc
etc. se da en la página 275. - ^ - Manual de funciones de la biblioteca FreeBSD
- ^ a b "Casting malloc" . Cprogramming.com . Consultado el 9 de marzo de 2007 .
- ^ "clang: lib / StaticAnalyzer / Checkers / MallocSizeofChecker.cpp Archivo de origen" . clang.llvm.org . Consultado el 1 de abril de 2018 .
- ^ "Lista de preguntas frecuentes de comp.lang.c · Pregunta 7.7b" . C-FAQ . Consultado el 9 de marzo de 2007 .
- ^ Reek, Kenneth (4 de agosto de 1997). Punteros sobre C (1 ed.). Pearson. ISBN 9780673999863.
- ^ "MEM04-C. Tenga cuidado con las asignaciones de longitud cero - Estándar de codificación SEI CERT C - Confluencia" . wiki.sei.cmu.edu .
- ^ "POSIX.1-2017: malloc" . pubs.opengroup.org . Consultado el 29 de noviembre de 2019 .
- ^ Despertado. "Cómo un error doble libre en WhatsApp se convierte en RCE" . Consultado el 29 de noviembre de 2019 .
- ^ Felker, Rich (3 de octubre de 2019). "Vaya. El RCE de WhatsApp fue un comportamiento incorrecto para la reasignación (p, 0) en el que insisten muchas implementaciones. Https://twitter.com/ottom6k/status/1179623539726524417…" . Twitter . Consultado el 29 de noviembre de 2019 . Enlace externo en
|title=
( ayuda ) - ^ Alexandrescu, Andrei (2001). Diseño C ++ moderno: programación genérica y patrones de diseño aplicados . Addison-Wesley. pag. 78.
- ^ "Página de inicio malloc de Wolfram Gloger" . malloc.de . Consultado el 1 de abril de 2018 .
- ^ a b c Kaempf, Michel (2001). "Trucos de vudo malloc" . Phrack (57): 8. Archivado desde el original el 22 de enero de 2009 . Consultado el 29 de abril de 2009 .
- ^ "Glibc: Malloc Internals" . sourceware.org Trac . Consultado el 1 de diciembre de 2019 .
- ^ a b c Lee, Doug. "Un asignador de memoria" . Consultado 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" . Angst del juego . Consultado el 1 de diciembre de 2019 .
- ^ Evans, Jason (16 de abril de 2006). "Una implementación de malloc (3) concurrente escalable para FreeBSD" (PDF) . Consultado el 18 de marzo de 2012 .
- ^ "libc / stdlib / malloc.c" . Referencia cruzada BSD, OpenBSD src / lib / .
- ^ Berger, ED; McKinley, KS ; Blumofe, RD; Wilson, PR (noviembre de 2000). Hoard: un asignador de memoria escalable para aplicaciones multiproceso (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 malloc () optimizado como código abierto - Slashdot
- ^ Página de inicio de TCMalloc
- ^ Ghemawat, Sanjay; Menage, Paul; TCMalloc: Malloc de almacenamiento en caché de subprocesos
- ^ Callaghan, Mark (18 de enero de 2009). "MySQL de alta disponibilidad: doble rendimiento de sysbench con TCMalloc" . Mysqlha.blogspot.com . Consultado el 18 de septiembre de 2011 .
- ^ "kmalloc () / kfree () incluye / 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 . La Serie Morgan Kaufmann en Ingeniería de Software y Programación (1 ed.). San Francisco, Estados Unidos: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382 . ISBN 978-1-55860-496-4 . Archivado desde el original el 5 de diciembre de 2012 . Consultado el 12 de enero de 2020 .Código: [1] [2] Errata: [3]
- ^ "malloc: hacer que malloc falle con solicitudes mayores que PTRDIFF_MAX" . Sourceware Bugzilla . 2019-04-18 . Consultado el 30 de julio de 2020 .
- ^ "¿Por qué el uso de alloca () no se considera una buena práctica?" . stackoverflow.com . Consultado el 5 de enero de 2016 .
- ^ Amarasinghe, Saman; Leiserson, Charles (2010). "6.172 Ingeniería de Desempeño de Sistemas Software, Clase 10" . MIT OpenCourseWare . Instituto de Tecnología de Massachusetts. Archivado desde el original el 22 de junio de 2015 . Consultado el 27 de enero de 2015 .
- ^ "alloca (3) - página de manual de Linux" . man7.org . Consultado el 5 de enero de 2016 .
- ^ - Referencia de interfaces del sistema, la especificación única de UNIX , número 7 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; La página de inicio de The Hoard
- Douglas, Niall; La página de inicio de nedmalloc
- Evans, Jason; La página de inicio de jemalloc
- Algoritmos simples de asignación de memoria en la comunidad OSDEV
- Michael, Maged M .; Asignación de memoria dinámica escalable sin bloqueos
- Bartlett, Jonathan; Gestión interna de la memoria : las opciones, las compensaciones y las implementaciones de la asignación dinámica
- Página wiki de Reducción de memoria (GNOME) con mucha información sobre cómo arreglar malloc
- Borrador estándar C99, incluido TC1 / TC2 / TC3
- Algunas referencias útiles sobre C
- ISO / IEC 9899 - Lenguajes de programación - C
- Entendiendo glibc malloc