Durée de vie objet [Résolu]

Signaler
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 octobre 2007
-
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 octobre 2007
-
Bonjour,

je cherche à savoir quelle est la durée de vie des objets créés à l'intérieur d'expressions. Par exemple :
#include <stdio.h>
class Fichier {
public:
  Fichier(const char* path) {
    f = fopen(path, "r");
    printf("Ouverture de %s\n", path);
  }
  ~Fichier() {
    printf("Fermeture\n");
    if (f) fclose(f);
  }
  FILE* f;
};

void truc(FILE* f) {
  printf("Traitement en cours...\n");
}

int main() {
  truc(Fichier("test.txt").f);
  return 0;
}

Dans main, un objet Fichier est créé, et son membre f est passé comme argument à la fonction truc. Avec les compilateurs que j'ai testés, l'objet est détruit après l'appel de truc et tout se passe bien (le fichier est fermé après être lu) :
Ouverture de test.txt
Traitement en cours...
Fermeture

Est-ce que le C++ garantit cet ordre d'exécution ou est-ce que ça peut changer selon le compilateur ?

Merci

5 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
A mon avis il attendra toujours le retour de la fonction pour la simple raison que dans le cas contraire cela pourrait poser problème : utilisation de mémoire libérée, de handle désalloué...
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 octobre 2007

Finalement j'ai trouvé une confirmation dans un draft du standard c++
Temporary objects are destroyed as the last step
in evaluating the full-expression that (lexically)
contains the point where they were created.
La "full-expression" doit inclure l'appel de fonction donc l'objet n'est jamais détruit trop tôt.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Oui un objet (statique du moins) est détruit automatiquement selon sa portée : s'il est déclaré en tête de fichier, il est initialisé au démarrage du programme par la CRT et détruit à la fin; s'il est déclaré dans une fonction, il est détruit à la fin de la fonction. Ainsi ne jamais renvoyer un pointeur ou une référence sur un objet déclaré dans une fonction; Par contre si on crée un objet de manière dynamique (sur le tas, avec new par ex.), c'est au programmeur de détruire l'objet lorsqu'il n'en a plus besoin.
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 octobre 2007

Mon problème, c'est qu'ici l'objet a une durée de vie encore plus courte : il est détruit automatiquement à la fin de l'instruction et pas de la fonction entière (on peut le voir en rajoutant un printf avant le return 0).

Donc ma question est : est-ce que le compilateur exécute forcément toute l'instruction "truc(Fichier("test.txt").f);" puis détruit l'objet Fichier, ou est-ce qu'il pourrait décider de récupérer la valeur de f et détruire l'objet avant même d'appeler la fonction 'truc' ?
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 octobre 2007

Merci pour la réponse. Il me semble en effet que l'objet temporaire est toujours détruit au point-virgule qui termine l'instruction, mais tant que je suis pas sûr à 100% j'éviterai la méthode.
Et si par hasard quelqu'un a un compilateur exotique avec lequel ça ne marche pas, n'hésitez pas, au moins ça règlera le problème.