xav0
Messages postés20Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention10 octobre 2007
-
24 sept. 2007 à 19:25
xav0
Messages postés20Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention10 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 ?
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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é...
xav0
Messages postés20Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention10 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.
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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.
xav0
Messages postés20Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention10 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' ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
xav0
Messages postés20Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention10 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.