2017-03-20 23 views
2

據我所知,編譯器會自動生成代碼來調用析構函數刪除對象時,它不再需要,在範圍內結束。Rust中可能在範圍結束之前刪除一個對象嗎?

在某些情況下,這是有益的,只要它不再需要刪除,而不是等待它走出去的範圍對象。是否有可能在Rust中顯式調用對象的析構函數?

回答

9

是否有可能在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) { } 
7

,官方的回答是叫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) { } 

就這樣。

任何取得所有權的函數都會導致該參數在該函數結束時被刪除。從查看來電者的角度來看,這是一個早期的下降:)

+0

'drop'是中拉開序幕;不需要限制它。 – Shepmaster

+0

@Shepmaster:證明我有多麼頻繁求助於它,我猜。 –

+3

呀,前些天我們試圖找出了'drop'一個真正的用例。我仍然不知道那裏是否有我遇到的一個。通常,如果我有一些資源需要清理,則使用範圍更爲明顯。我仔細查看Rust的來源,看看他們在哪裏使用它,但這是一個棘手的問題,我越來越無聊。 ;-) – Shepmaster

相關問題