Durée de vie objet

Résolu
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007 - 24 sept. 2007 à 19:25
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007 - 25 sept. 2007 à 22:34
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

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
25 sept. 2007 à 13:10
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é...
3
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
25 sept. 2007 à 22:34
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.
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
24 sept. 2007 à 20:16
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.
0
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
24 sept. 2007 à 20:35
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' ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xav0 Messages postés 20 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 10 octobre 2007
25 sept. 2007 à 15:17
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.
0