Si noti che l'inizializzazione zero eseguita dal sistema operativo come funzionalità di sicurezza viene in genere eseguita solo alla prima allocazione della memoria. Con ciò intendo qualsiasi segmento nelle sezioni heap, stack e dati. Le sezioni stack e dati sono in genere di dimensioni fisse e vengono inizializzate quando l'applicazione viene caricata in memoria.
Il segmento di dati (che contiene dati/codice statici/globali) non viene in genere "riutilizzato", sebbene ciò potrebbe non essere il caso se si carica dinamicamente il codice in fase di runtime.
La memoria nel segmento di stack viene riutilizzata continuamente. Variabili locali, frame di stack di funzioni, ecc. Vengono costantemente utilizzati e riutilizzati e non vengono inizializzati ogni volta, proprio quando l'applicazione viene caricata per la prima volta.
Tuttavia, quando l'applicazione effettua richieste di memoria heap, il gestore di memoria tipicamente zero inizializzare segmenti di memoria prima di concedere la richiesta, ma solo per i nuovi segmenti. Se si effettua una richiesta per memoria heap e c'è spazio libero in un segmento già inizializzato, l'inizializzazione non viene eseguita una seconda volta. Pertanto, non vi è alcuna garanzia che se quel particolare segmento di memoria viene riutilizzato dall'applicazione, verrà nuovamente inizializzato a zero.
Quindi, ad esempio, se si assegna un Foo all'heap, assegnare un valore al proprio campo, eliminare l'istanza di Foo e quindi creare un nuovo Foo sull'heap, c'è la possibilità che il nuovo Foo venga assegnato nella stessa esatta locazione di memoria del vecchio Foo, e quindi il suo campo avrà inizialmente lo stesso valore del campo del vecchio Foo.
Se ci pensate, questo ha un senso, perché il sistema operativo è in fase di inizializzazione i dati solo per evitare che un'applicazione di accedere ai dati da un'altra applicazione. C'è meno rischio nel permettere ad un'applicazione di accedere ai propri dati, quindi per motivi di prestazioni l'inizializzazione non viene eseguita ogni volta - solo la prima volta che un particolare segmento di memoria è reso disponibile per l'uso dall'applicazione (in qualsiasi segmento).
A volte quando si esegue un'applicazione in modalità di debug, tuttavia, alcuni runtime della modalità di debug inizializzano i dati stack e heap ad ogni allocazione (quindi il campo Foo verrà sempre inizializzato). Tuttavia, diversi runtime di debug inizializzano i dati a valori diversi. Alcuni zero inizializzano e alcuni inizializzano con un valore di "marker".
Il punto è - mai e poi mai utilizzare i valori non inizializzati qualsiasi punto del codice. Non è assolutamente garantito che verranno azzerati. Inoltre, assicurati di leggere l'articolo precedentemente collegato relativo all'inizializzazione di parens e default vs value poiché questo influenza la definizione di un valore "non inizializzato".
Sei sicuro che sia C++ e non, ad esempio, il tuo sistema operativo? Immagino (ma non ho controllato) che quando un sistema operativo assegna memoria al processo, lo azzererebbe, almeno quando si tocca la pagina di memoria. Né C né C++ richiedono questo comportamento, ma se il sistema operativo ti dà delle pagine di memoria con qualunque sia l'ultimo processo inserito, sarebbe un grosso buco di sicurezza. Potrebbero esserci informazioni di accesso o chiavi private se, per esempio, ssh fosse l'ultimo processo per utilizzare quella pagina di memoria fisica. –
Sembrerebbe un po 'dispendioso che il sistema operativo continui a azzerare la memoria quando viene allocata. – Alan
Si potrebbe anche leggere l'eccellente post correlati da Michael Burr in risposta a [fare le parentesi dopo il nome del tipo fanno la differenza con nuova?] (Http://stackoverflow.com/questions/620137/do-the-parentheses- after-the-type-name-make-a-difference-with-new/620402 # 620402) –