capypad
0 Tage Serie
rust / intermediate
Snippet

RAII und das Drop Trait für Ressourcenmanagement

RAII (Resource Acquisition Is Initialization) stellt sicher, dass Ressourcen freigegeben werden, wenn Objekte den Gültigkeitsbereich verlassen. Das Drop-Trait definiert Bereinigungslogik, die automatisch ausgeführt wird, wenn ein Wert verworfen wird. In diesem Beispiel umschließt FileGuard eine File und gibt eine Nachricht aus, wenn es verworfen wird, was Bereinigung selbst bei Fehlern garantiert. Rusts Besitzsystem stellt sicher, dass drop genau einmal ausgeführt wird, was Double-Free-Fehler eliminiert.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use std::fs::File;
use std::io::Write;
use std::path::Path;
 
struct FileGuard {
filename: String,
file: Option<File>,
}
 
impl FileGuard {
fn new(name: &str) -> Result<Self, std::io::Error> {
let file = File::create(Path::new(name))?;
Ok(FileGuard {
filename: name.to_string(),
file: Some(file),
})
}
 
fn write(&mut self, content: &str) -> Result<(), std::io::Error> {
if let Some(ref mut f) = self.file {
f.write_all(content.as_bytes())?
}
Ok(())
}
}
 
impl Drop for FileGuard {
fn drop(&mut self) {
println!("Cleaning up: {}", self.filename);
self.file.take();
}
}
 
fn main() -> Result<(), std::io::Error> {
let guard = FileGuard::new("example.txt")?;
guard.write("Hello, Rust!")?;
println!("File written successfully");
Ok(())
}
Erklärung
1
impl Drop for FileGuard
Drop-Trait wird automatisch aufgerufen, wenn FileGuard den Gültigkeitsbereich verlässt
2
self.file.take();
take() ersetzt Some durch None, stellt File-Schließen sicher und verhindert Double-Drop
3
guard.write("Hello, Rust!")?;
Wenn Schreiben fehlschlägt, propagiert ? den Fehler, aber guard wird trotzdem verworfen
4
println!("File written successfully");
Garantierte Bereinigung erfolgt nach Abschluss dieser Zeile