Drop

The Drop trait only has one method: drop, which is called automatically when an object goes out of scope. The main use of the Drop trait is to free the resources that the implementor instance owns.

Box, Vec, String, File, and Process are some examples of types that implement the Drop trait to free resources. The Drop trait can also be manually implemented for any custom data type.

The following example adds a print to console to the drop function to announce when it is called.

For a more practical example, here's how the Drop trait can be used to automatically clean up temporary files when they're no longer needed:

use std::fs::File; use std::path::PathBuf; struct TempFile { file: File, path: PathBuf, } impl TempFile { fn new(path: PathBuf) -> std::io::Result<Self> { // Note: File::create() will overwrite existing files let file = File::create(&path)?; Ok(Self { file, path }) } } // When TempFile is dropped: // 1. First, the File will be automatically closed (Drop for File) // 2. Then our drop implementation will remove the file impl Drop for TempFile { fn drop(&mut self) { // Note: File is already closed at this point if let Err(e) = std::fs::remove_file(&self.path) { eprintln!("Failed to remove temporary file: {}", e); } println!("> Dropped temporary file: {:?}", self.path); } } fn main() -> std::io::Result<()> { // Create a new scope to demonstrate drop behavior { let temp = TempFile::new("test.txt".into())?; println!("Temporary file created"); // File will be automatically cleaned up when temp goes out of scope } println!("End of scope - file should be cleaned up"); // We can also manually drop if needed let temp2 = TempFile::new("another_test.txt".into())?; drop(temp2); // Explicitly drop the file println!("Manually dropped file"); Ok(()) }