resueltos memoria ejercicios ejemplos dinamicos dinamica asignacion arreglos c++ string char

ejercicios - ¿Es una cadena literal en c++ creada en memoria estática?



malloc y calloc (4)

¿Es una cadena literal en c ++ creada en memoria estática y destruida solo cuando el programa sale?


Bueno, sí. De alguna manera tienen que serlo; la información que compone la secuencia de caracteres en cada cadena tiene que estar en alguna parte. Si se asignaran dinámicamente y luego se inicializaran, ¿dónde residiría la información utilizada para la inicialización? Por lo tanto, es más eficiente simplemente hacer las cadenas estáticas, de modo que estén siempre disponibles y sean válidas una vez que el programa termine de cargarse.


Donde realmente se crea es una decisión de implementación del escritor del compilador, realmente. Lo más probable es que los literales de cadena se almacenen en segmentos de solo lectura de memoria ya que nunca cambian.

En los viejos días de compilación, solía tener datos estáticos como estos literales y datos globales pero modificables. Estos se almacenaron en el segmento TEXTO (código) y en el segmento DATOS (datos inicializados).

Incluso cuando tienes código como char *x = "hello"; , la cadena de hello se almacena en memoria de solo lectura mientras que la variable x está en la pila (o en cualquier otro lugar de la memoria grabable si es global). x simplemente se establece en la dirección de la cadena de hello . Esto permite todo tipo de cosas complicadas como el plegado de cadenas, por lo que la "opción inválida" (0x1000) y la "opción válida" (0x1002) pueden usar el mismo bloque de memoria de la siguiente manera:

+-> plus:0 1 2 3 4 5 6 7 8 9 A B C D E | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+ 0x1000 | i | n | v | a | l | i | d | | o | p | t | i | o | n | /0 | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

Tenga en cuenta que no me refiero a la memoria de solo lectura en términos de ROM, solo la memoria que está dedicada a almacenar cosas inmutables (que pueden estar marcadas como de solo lectura por el sistema operativo).

Tampoco se destruyen hasta que sale main() .


Los literales de cadena se almacenan en segmentos de solo lectura de la memoria


Sí, los literales de cadena son válidos durante toda la duración del programa, incluso durante la destrucción de objetos estáticos.

2.13.4 / 1 en el estándar dice

Un literal de cadena ordinaria tiene el tipo "array of n const char" y duración de almacenamiento estático.

El estándar dice de ''duración de almacenamiento estático'' en 3.7.1 / 1:

El almacenamiento de estos objetos durará por la duración del programa.