據我所知,編譯器會自動生成代碼來調用析構函數刪除對象時,它不再需要,在範圍內結束。Rust中可能在範圍結束之前刪除一個對象嗎?
在某些情況下,這是有益的,只要它不再需要刪除,而不是等待它走出去的範圍對象。是否有可能在Rust中顯式調用對象的析構函數?
據我所知,編譯器會自動生成代碼來調用析構函數刪除對象時,它不再需要,在範圍內結束。Rust中可能在範圍結束之前刪除一個對象嗎?
在某些情況下,這是有益的,只要它不再需要刪除,而不是等待它走出去的範圍對象。是否有可能在Rust中顯式調用對象的析構函數?
是否有可能在Rust中刪除範圍結束之前的對象?
是的。
是否有可能在Rust中顯式調用對象的析構函數?
號
爲了澄清,您可以使用std::mem::drop
傳遞一個變量,從而導致它走出去的範圍的所有權:
struct Noisy;
impl Drop for Noisy {
fn drop(&mut self) {
println!("Dropping Noisy!");
}
}
fn main() {
let a = Noisy;
let b = Noisy;
println!("1");
drop(b);
println!("2");
}
1
Dropping Noisy!
2
Dropping Noisy!
但是,你被禁止從自己調用析構函數。這樣做會導致雙重釋放的情況下,因爲編譯器仍然會插入到該Drop
特徵的自動呼叫。
好玩側面說明 - 的drop
的實現是很優雅:
pub fn drop<T>(_x: T) { }
,官方的回答是叫mem::drop
:
fn do_the_thing() {
let s = "Hello, World".to_string();
println!("{}", s);
drop(s);
println!("{}", 3);
}
但是,請注意mem::drop
什麼特別的。這裏是the definition in full:
pub fn drop<T>(_x: T) { }
就這樣。
任何取得所有權的函數都會導致該參數在該函數結束時被刪除。從查看來電者的角度來看,這是一個早期的下降:)
'drop'是中拉開序幕;不需要限制它。 – Shepmaster
@Shepmaster:證明我有多麼頻繁求助於它,我猜。 –
呀,前些天我們試圖找出了'drop'一個真正的用例。我仍然不知道那裏是否有我遇到的一個。通常,如果我有一些資源需要清理,則使用範圍更爲明顯。我仔細查看Rust的來源,看看他們在哪裏使用它,但這是一個棘手的問題,我越來越無聊。 ;-) – Shepmaster