Retour à la leçonMission
Mission : un message de fermeture qui disparaît toujours du fichier de log
Diagnostiquer un bug d'ordre de destruction lié au Drop, puis distinguer l'ordre de destruction de l'optimisation du layout mémoire d'une struct.
Contexte
Un service crée, dans cet ordre, une ConnexionDb puis un FichierLog :
rust
struct ConnexionDb { nom: String }
impl Drop for ConnexionDb {
fn drop(&mut self) {
println!("fermeture de la connexion {}", self.nom);
// veut ecrire une derniere ligne "connexion fermee" dans le fichier de log ici
}
}
struct FichierLog { nom: String }
impl Drop for FichierLog {
fn drop(&mut self) {
println!("fermeture du fichier {}", self.nom);
}
}
fn main() {
let connexion = ConnexionDb { nom: String::from("prod-db") };
let fichier = FichierLog { nom: String::from("app.log") };
// ... utilisation de connexion et fichier
}Le Drop de ConnexionDb est censé écrire une dernière ligne dans le fichier de log avant de couper la connexion. Mais en observant app.log après chaque exécution de test, l'équipe constate que ce message n'apparaît jamais — comme si le fichier était déjà fermé au moment où ConnexionDb::drop s'exécute.