La destruction d’un objet
Les références peuvent être copiées pour créer de nouvelles références pointant vers le même objet. Cependant, ces références ne sont pas éternelles et peuvent être détruites. Lorsqu’une référence est détruite, le compteur de référence de l’objet associé à cette référence est décrémenté. Si le compteur de référence atteint 0, l’objet est considéré comme inutilisé. C’est à ce moment-là que le DESTRUCTEUR est appelé automatiquement par le langage de programme. Puisque cet appel est automatique, il est impossible de lui donner des arguments au destructeur. Une fois l’objet détruit, la partie mémoire qu’il utilisait pourra ensuite être recyclée tôt ou tard par votre système d’exploitation.
CLASSE Vehicule: VARIABLE couleur: CHAINE VARIABLE marque: CHAINE VARIABLE longueur: ENTIER CONSTRUCTEUR (uneCouleur: CHAINE, uneMarque: CHAINE, uneLongueur: ENTIER) couleur <- uneCouleur marque <- uneMarque longueur <- uneLongueur FIN CONSTRUCTEUR DESTRUCTEUR() AFFICHER "Fin de vie du véhicule de couleur: ", couleur, " de marque ", marque, " et de longueur: ", longueur" FIN DESTRUCTEUR FIN CLASSE
class Vehicule: def __init__(self, uneCouleur: str, uneMarque: str, uneLongueur: int): self.couleur = uneCouleur self.marque = uneMarque self.longueur = uneLongueur def __del__(self): print("Fin de vie du véhicule de couleur:", self.couleur, "de marque", self.marque, "et de longueur:", self.longueur)
class Vehicule { std::string couleur; std::string marque; int longueur; Vehicule(std::string uneCouleur, std::string uneMarque, int uneLongueur) { couleur = uneCouleur; marque = uneMarque; longueur = uneLongueur; } ~Vehicule() { cout << "Fin de vie du véhicule de couleur: " << couleur << " de marque " << marque << " et de longueur: " << longueur << endl; } };
public class Vehicule { public string couleur; public string marque; public int longueur; public Vehicule(string uneCouleur, string uneMarque, int uneLongueur) { couleur = uneCouleur; marque = uneMarque; longueur = uneLongueur; } ~Vehicule() { Console.WriteLine("Fin de vie du véhicule de couleur: " + couleur + " de marque " + marque + " et de longueur: " + longueur); } }
Le déréférencement manuel peut être effectué en réinitialisant la variable contenant une référence ou en lui affectant une autre valeur. Dans tous les cas, cela décrémente le compteur de référence de l’objet associé à cette référence. Si le compteur de référence atteint 0, l’objet est supprimé de la mémoire.
Dans l’exemple ci-dessous, le compteur de référence passe grimpe à 2. Lorsque la variable “unVehicule” est réinitialisée, le compteur de référence est décrémenté d’un cran. Pourtant, l’objet Vehicule n’est pas effacé de la mémoire, car il est toujours connu par une autre variable: en l’occurrence “uneVoitureRouge”. Ce n’est qu’une fois que cette dernière variable est également réinitialisée que le compteur passe à 0 et que l’objet est finalement détruit.
unVehicule <- Vehicule("rouge", "Renault", 400) uneVoitureRouge <- unVehicule unVehicule <- NULL uneVoitureRouge <- NULL
unVehicule = Vehicule("rouge", "Renault", 400) uneVoitureRouge = unVehicule unVehicule = None uneVoitureRouge = None
auto unVehicule = std::make_shared<Vehicule>("rouge", "Renault", 400); auto uneVoitureRouge = unVehicule; unVehicule.reset(); uneVoitureRouge.reset();
Vehicule unVehicule = new Vehicule("rouge", "Renault", 400); Vehicule uneVoitureRouge = unVehicule; unVehicule = null; uneVoitureRouge = null;
Enfin, une variable est automatiquement déréférencée lorsque sa portée prend fin. Si vous déclarez une variable dans une condition, une boucle ou une fonction, elle sera détruite à la fin de celle-ci. Ainsi, lorsque la variable n’est plus accessible, elle est automatiquement supprimée et le compteur de référence de l’objet associé est décrémenté. Là aussi, dans tous les cas, cela décrémente le compteur de référence de l’objet associé à cette référence. Là aussi, si le compteur de référence atteint 0, l’objet est supprimé de la mémoire.
Dans l’exemple ci-dessous, la voiture rouge est perdue une fois la fonction terminée, car sa référence n’a pas été sauvegardée par une autre variable. La voiture bleue, quant à elle, est gardée en mémoire puisque sa référence a été copiée dans la variable “uneVoiture” en fin de fonction.
FONCTION TEST_PORTEE(): VOITURE uneVoitureRouge <- Vehicule("rouge", "Renault", 400) uneVoitureBleue <- Vehicule("bleue", "Renault", 400) RETOURNER uneVoitureBleue FIN FONCTION uneVoiture <- TEST_PORTEE()
def testPortee(): uneVoitureRouge = Vehicule("rouge", "Renault", 400) uneVoitureBleue = Vehicule("bleue", "Renault", 400) return uneVoitureBleue uneVoiture = testPortee()
Vehicule testPortee() { Vehicule uneVoitureRouge("rouge", "Renault", 400); Vehicule uneVoitureBleue("bleue", "Renault", 400); return uneVoitureBleue; } Vehicule uneVoiture = testPortee();
Vehicule TestPortee() { Vehicule uneVoitureRouge = new Vehicule("rouge", "Renault", 400); Vehicule uneVoitureBleue = new Vehicule("bleue", "Renault", 400); return uneVoitureBleue; } Vehicule uneVoiture = TestPortee();