Tenga en cuenta que la inicialización a cero realizada por el sistema operativo como característica de seguridad generalmente solo se realiza la primera vez que se asigna la memoria. Con eso me refiero a cualquier segmento en las secciones de montón, pila y datos. Las secciones de pila y datos son típicamente de tamaño fijo y se inicializan cuando la aplicación se carga en la memoria.
El segmento de datos (que contiene datos y códigos estáticos/globales) normalmente no se "reutiliza", aunque puede no ser el caso si carga dinámicamente el código en tiempo de ejecución.
La memoria en el segmento de pila se vuelve a utilizar todo el tiempo. Las variables locales, los marcos de pila de funciones, etc. se utilizan y reutilizan constantemente, y no se inicializan cada vez, solo cuando se carga la aplicación por primera vez.
Sin embargo, cuando la aplicación hace que las solicitudes de memoria de almacenamiento dinámico, el administrador de memoria normalmente cero a inicializar los segmentos de memoria antes de conceder la petición, pero sólo para los nuevos segmentos. Si realiza una solicitud de memoria Heap, y hay espacio libre en un segmento que ya se ha inicializado, la inicialización no se realiza por segunda vez. Por lo tanto, no hay garantía de que si su aplicación vuelve a usar ese segmento de memoria en particular, se reiniciará a cero.
Así, por ejemplo, si asigna un Foo en el montón, asigne su campo un valor, eliminar la instancia de Foo, y luego crear una nueva Foo en el montón, existe la posibilidad de que el nuevo Foo se asignará en la misma ubicación de memoria exacta que el antiguo Foo, por lo que su campo tendrá inicialmente el mismo valor que el antiguo campo de Foo.
Si se piensa en ello, esto tiene sentido, debido a que el sistema operativo sólo está inicializando los datos para evitar una aplicación acceda a los datos de otra aplicación. Hay menos riesgos al permitir que una aplicación acceda a sus propios datos, por lo que, por motivos de rendimiento, la inicialización no se realiza todas las veces, solo la primera vez que un segmento particular de la memoria está disponible para la aplicación (en cualquier segmento).
A veces, cuando ejecuta una aplicación en modo de depuración, algunos tiempos de ejecución del modo de depuración inicializan los datos de la pila y del montón en cada asignación (así que su campo Foo siempre se inicializará). Sin embargo, diferentes tiempos de ejecución de depuración inicializan los datos en diferentes valores. Algunos se inicializan en cero y algunos se inicializan en un valor de "marcador".
El punto es - nunca utilizar valores sin inicializar cualquier parte del código. No hay absolutamente ninguna garantía de que se inicializarán en cero. Además, asegúrese de leer el artículo vinculado anteriormente con respecto a los paréntesis y la inicialización de valores predeterminados frente a valores, ya que esto afecta la definición de un valor "no inicializado".
¿Estás seguro de que es C++ y no, por ejemplo, el sistema operativo? Me imagino (pero no lo he comprobado) que cuando un SO asigna memoria a su proceso, se pone a cero, al menos cuando toca la página de memoria. Ni C ni C++ requieren este comportamiento, pero si el sistema operativo le entrega páginas de memoria con lo que sea que el último proceso haya insertado en ellas, sería un gran agujero de seguridad. Podría haber información de inicio de sesión o claves privadas allí si, por ejemplo, ssh fuera el último proceso para usar esa página de memoria física. –
Parecería un poco inútil para el sistema operativo mantener a cero la memoria cuando se asigna. – Alan
También puede leer el excelente, puesto relacionado por Michael Burr en respuesta a [¿Los paréntesis después del nombre del tipo marcan la diferencia con el nuevo?] (Http://stackoverflow.com/questions/620137/do-the-parentheses- after-the-type-name-make-a-difference-with-new/620402 # 620402) –