Pregunta

¿Se inicializa la memoria global en C++?Y si es así, ¿cómo?

(Segunda) aclaración:

Cuando se inicia un programa, ¿qué hay en el espacio de memoria que se convertirá en memoria global, antes de que se inicialicen las primitivas?Estoy tratando de entender si está puesto a cero o si es basura, por ejemplo.

La situación es:¿Se puede establecer una referencia singleton - a través de un instance() llamar, antes de su inicialización:

MySingleton* MySingleton::_instance = NULL;

y obtener dos instancias singleton como resultado?

Vea mi cuestionario de C++ sobre múltiples instancias de un singleton...

¿Fue útil?

Solución

Sí, las primitivas globales se inicializan en NULL.

Ejemplo:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

No se pueden hacer suposiciones sobre clases, estructuras, matrices, bloques de memoria en el montón...

Es más seguro inicializar siempre todo.

Otros consejos

De la norma:

Los objetos con duración de almacenamiento estático (3.7.1) se inicializarán en cero (8.5) antes de que tenga lugar cualquier otra inicialización.La inicialización cero y la inicialización con una expresión constante se denominan colectivamente inicialización estática;todas las demás inicializaciones son inicialización dinámica.Los objetos de tipo POD [datos antiguos simples] (3.9) con duración de almacenamiento estático inicializados con expresiones constantes (5.19) se inicializarán antes de que tenga lugar cualquier inicialización dinámica.Los objetos con duración de almacenamiento estático definidos en el alcance del espacio de nombres en la misma unidad de traducción e inicializados dinámicamente se inicializarán en el orden en que aparece su definición en la unidad de traducción.[Nota: 8.5.1 describe el orden en el que se inicializan los miembros agregados.La inicialización de los objetos estáticos locales se describe en 6.7.

Entonces sí, se inicializarán los globales que tienen una duración de almacenamiento estático.Los globales asignados, por ejemplo, en el montón, por supuesto, no se inicializarán automáticamente.

Viniendo del mundo incrustado...

Su código se compila en tres tipos de memoria:
1..datos:memoria inicializada
2..texto:constantes y código
3..bss:memoria no inicializada (inicializada a 0 en C++ si no se inicializa explícitamente)

Los globales van en .data si se inicializan.De lo contrario, se colocan en .bss y se ponen a cero en el código preprincipal.

Las variables declaradas con alcance estático/global siempre se inicializan al menos en VC++.

En algunas circunstancias, puede haber una diferencia de comportamiento entre:

int x = 0;

int main() { ... }

y

int x;

int main() { ... }

Si está utilizando segmentos de datos compartidos, entonces VC++ al menos usa la presencia de una inicialización explícita junto con un #pragma data_seg para determinar si una variable particular debe ir en el segmento de datos compartidos o en el segmento de datos privados de un proceso.

Para mayor diversión, considere lo que sucede si tiene un objeto C++ estático con un constructor/destructor declarado en un segmento de datos compartido.Se llama al constructor/destructor cada vez que el exe/dll se adjunta al segmento de datos, que casi con seguridad no es lo que desea.

Más detalles en este artículo de la base de conocimientos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top