2016-01-12 50 views
2

從Rust文檔。誰是負責釋放內存後消耗內存

into_raw函數消耗一個盒子並返回原始指針。它不會銷燬T或釋放任何內存。

在此代碼

fn main() { 
    let b = Box::new("hello".to_owned()); 
    let a: *mut String = Box::into_raw(b); 
} 

我沒有使用unsafe塊和作爲結果,我們應該沒有內存泄漏。因此,如果Box對象在使用後沒有責任釋放內存,但內存不會被釋放並可供進一步使用,並且原始指針不會由資源擁有,誰將釋放內存?

+5

您可以在不使用'unsafe'的情況下泄漏內存。內存泄漏不會違反內存安全。 – fjh

+0

@fjh,感謝提醒,我忘記了這一點 –

回答

4

免責聲明:由@fjh在評論中指出,但值得一提。

內存安全性一般沒有明確定義,因此爲Rust定義了一個特定的定義。它的要點是對於Rust來說,內存安全意味着:只訪問分配和初始化的內存。

這個定義的後果是內存泄漏是安全的,因爲它們不會導致懸空指針。不運行析構函數也是安全的,因爲它們不能破壞內存安全(儘管這可能會泄漏其他資源)。


Box::into_raw主要是爲了與互動FFI,以便能夠跨越語言界限轉讓所有權,正如文件中提到的正確方式釋放內存是使用Box::from_raw從它重新創建一個Box

6

https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.into_raw指定:「在調用此函數之後,調用者負責先前由Box管理的內存,特別是調用者應該正確銷燬T並釋放內存,正確的方法是將指針轉換回Box Box :: from_raw函數,因爲Box沒有指定內存如何分配。「

所以,如果你讓你的原始指針退出scobe而沒有將它轉換回一個盒子,你有內存泄漏。