begin process at 2012 02 11 11:41:49
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Durée de vie objet


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Durée de vie objet

lundi 24 septembre 2007 à 19:25:36 | Durée de vie objet

xav0

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

lundi 24 septembre 2007 à 20:16:11 | Re : Durée de vie objet

juju12

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.
lundi 24 septembre 2007 à 20:35:32 | Re : Durée de vie objet

xav0

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' ?

mardi 25 septembre 2007 à 13:10:47 | Re : Durée de vie objet

juju12

Réponse acceptée !
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é...
mardi 25 septembre 2007 à 15:17:36 | Re : Durée de vie objet

xav0

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.

mardi 25 septembre 2007 à 22:34:45 | Re : Durée de vie objet

xav0

Réponse acceptée !
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.



Cette discussion est classée dans : fichier, objet, truc, durée, vie


Répondre à ce message

Sujets en rapport avec ce message

tableau d'objet comme variable d'instance [ par MrKribou ] Bon dans le fichier .h (ou fait c comment qu'on appele se fichier la ? header ?) comment declare ton un tableau d'objet comme variable d'instance.Par ecriture dans un fichier [ par alphaone ] je cherche à écrire le comptenu d'une variable dans un fichier. mais un truc qui marche avec dev cpp 4.9.9.1. merci car mes librairie ofstream ou un (dé)Sérialisation d'objet... [ par zouippy ] Bonjour à tous! Voilà, je vous explique mon problème: J'ai un fichier extérieur à mon programme c++, qui contient (à mon avi) un object sérialisé... M sauver et charger [ par acety ] voila mon code merci de me dire si j'ai fai des erreurs deja car quand je veu charger il n'arrive po a me charger l'objet.char name[10]char objet[8]le Problème avec liste chainée [ par quiz82 ] salut tout le monde g un programme qui gere des RDV en C++ et j aimerai rajouter des fonctions pour annuler ou supprimer un RDV, et une fonction qui m mciSendTring : traduction code vb en c++ !! durée d'un fichier video [ par bilal ] J'essaie de recuper la durée d'un fichier video en particulier .flv ou .swfj'ai pu traduire ce code Vb pour  c++ Builder mais il ne se passe rien, ca Lecture d'un objet de taille variable à partir d'un fichier [ par chelheb ] Bonjour tout le monde !Je travaille actuellement sur un projet en MFC, et j'ai quelques problèmes en ce qui concerne la lecture à partir d'un fichier Télécharger fichier via HTTP sous linux [ par rclsilver02 ] Bonjour, je cherche depuis quelque temps comment télécharger un fichier via http sous linux. j'ai bricolé un tit truc avec socket() et cie mais c'est un peu perdu... [ par sheorogath ] bjr ,me remettant au c++ pour la enieme fois je voulais creer un petit programme permettant de lister les fichier d'un certain type alors je commence


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,586 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales