>>756
その仮説で正しそうだが念のため確認してみた
まず>>741の通りだとdrop()を呼び出さずに当然コンパイルが通るので
何でもいいから関数呼び出し(演算含む)するものを間に挟んでみた
let foo = Foo::new("Hello, World!");
println!("test"); // ←ここに挿入
foo.finalize()?;
するとこの形はdrop()を呼び出ように変化するようでリンクエラーとなる
この関数呼び出しはfooの参照を使うか否かに関係なく同じ結果
ところがfoo生成前に置くとコンパイルが通る
println!("test");
let foo = Foo::new("Hello, World!");
foo.finalize()?;
さらにfoo消滅後に置いてもコンパイルが通る
let foo = Foo::new("Hello, World!");
foo.finalize()?;
println!("test");
したがってfooが有効な期間に何か関数呼び出しがそこで起きる時のみ
drop()が呼ばれるコードが用意されてリンクエラーとなっている
これはRustがpanic時もメモリ解放をきちんと扱う話とも合致する
つまりpanic時の巻き戻し時のfoo解放をコンパイラが用意している仮説で正しいようだ
次世代言語27 TypeScript Swift Go Kotlin Rust Nim
■ このスレッドは過去ログ倉庫に格納されています
760デフォルトの名無しさん
2022/08/22(月) 07:51:24.23ID:qagbwcru■ このスレッドは過去ログ倉庫に格納されています
