2015-07-09 17 views
5

considerare questo programma Rust:Perché questo programma di Rust non si blocca?

fn main() { 
    let mut z : Vec<Vec<(bool,f64)>> = Vec::with_capacity(10); 
    unsafe { z.set_len(10); } 
    z[0] = vec!((true,1.)); 
    println!("{:?}", z[0]); 
} 

https://play.rust-lang.org/?gist=ccf387ed66a0d8b832ed&version=stable

Rust deve tentare di eliminare z[0] quando abbiamo impostato, e dal momento che non è inizializzato z[0] dovrebbe mandare in crash il programma. Tuttavia, funziona bene. Perché?

+3

direi che sia a causa di un dettaglio di implementazione riguardante 'z..set_len'. Una volta che usi la semantica non sicura (in qualsiasi lingua), tutte le scommesse sono disattivate. Probabilmente si bloccherebbe più tardi, quando proverai ad accedere a qualsiasi cosa sia memorizzata nella posizione che l'assegnazione a 'z [0]' sovrascriverà, se ce ne sono. – jpaugh

risposta

6

Mentre la memoria di allocazione mucchio del Vec non risulta inizializzato, sarà più comunemente essere riempiti con zeri, e azzerato Vec è un vuoto Vec (String e Vec avere costruttori economici perché non fanno una dotazione per un vuoto array). Non c'è quindi alcuna assegnazione gratuita, e quindi non si blocca in questo caso particolare. Modifiche molto lievi, o l'esecuzione su una macchina con semantica di memoria non inizializzata leggermente diversa, potrebbero facilmente causarne il crash (che sarebbe una buona cosa - gli arresti anomali sono in genere più facili da eseguire sul debug rispetto a errori impercettibili).

This diagnosis can be seen to be the case.

Problemi correlati