2015-07-09 17 views
5

Rozważmy program Rust:Dlaczego ten program programu Rust nie działa?

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 powinien próbować upuść z[0] kiedy go ustawić, a od z[0] jest niezainicjowany powinien zawiesić program. Jednak działa dobrze. Czemu?

+3

Przypuszczam, że to ze względu na szczegóły wykonawcze dotyczące 'z..set_len'. Po użyciu niebezpiecznej semantyki (w dowolnym języku) wszystkie zakłady są wyłączone. Prawdopodobnie ulegnie to awarii później, gdy spróbujesz uzyskać dostęp do tego, co jest przechowywane w lokalizacji, do której przypisane jest 'z [0]', jeśli istnieje. – jpaugh

Odpowiedz

6

Choć pamięć alokacji sterty VEC jest zainicjalizowana, to będzie najczęściej być wypełnione zerami, a wyzerowany Vec jest pusty Vec (String i Vec mają niskie konstruktorów, ponieważ nie dokonać alokacji dla pusty szyk). Nie ma więc przydziału za darmo, a więc nie ulega awarii w tym konkretnym przypadku. Bardzo niewielkie modyfikacje lub uruchamianie go na maszynie z nieco odmienną semantyką pamięci niezainicjowanej może łatwo spowodować awarię (co byłoby dobrze - wypadki są zazwyczaj łatwiejsze do debugowania niż subtelne błędy).

This diagnosis can be seen to be the case.

Powiązane problemy