Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Langage
Langage Langage C++, Programmation Orientée Objet, Templates, etc. Avant de poster : FAQ C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/12/2012, 16h55   #1
Darz4
Invité de passage
 
Inscription : décembre 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 12
Points : 0
Points : 0
Par défaut new anonyme et fuite mémoire

Bonjour,

J'ai cherché un peu partout, mais n'ai pas trouvé de réponse à la question suivante.
Lors de cet appel :

Code :
MaProcedure( new long( 1 ) );
Sachant que MaProcedure ne fait pas de delete sur son paramètre, ce code produit-il une fuite mémoire ?
Ou bien l'appel à delete est-il implicite à la suite de cet appel ? Sachant que l'on instancie un type de base et non une classe.

Cordialement
Darz4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h06   #2
Awakening
Membre du Club
 
Inscription : septembre 2010
Messages : 67
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 67
Points : 61
Points : 61
Oui, cela génère une fuite mémoire, la variable ne sera pas détruite.
La destruction d'une variable à l'aide de new doit se faire explicitement avec un delete.

Le principe de l'allocation dynamique est justement de devoir manager "manuellement" une variable (qu'elle contienne un type de base ou non).

Pourquoi faire une telle chose, et ne pas passer par une fonction avec un passage de paramètre par référence ?
Awakening est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 17h41   #3
Darz4
Invité de passage
 
Inscription : décembre 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 12
Points : 0
Points : 0
Je vais donc déclarer une variable "dummy" et passer son adresse à la fonction. C'est moche, mais je n'ai pas le choix car il m'est interdit de modifier ou surcharger MaProcedure.

Merci pour votre réponse.
Darz4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 20h54   #4
Iradrille
Membre éprouvé
 
Homme
Étudiant
Inscription : juin 2012
Messages : 263
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 263
Points : 443
Points : 443
Citation:
Envoyé par Awakening Voir le message
Pourquoi faire une telle chose, et ne pas passer par une fonction avec un passage de paramètre par référence ?
Passer par un pointeur au lieu d'une référence est une question de préférence.
Perso je préfère un pointeur à la place d'une référence, je trouve ça plus lisible de passer un pointeur quand je sais que le paramètre va être modifié.
Par contre les références constantes sont pratique pour le passage d'objet.
Citation:
Envoyé par Darz4 Voir le message
C'est moche, mais je n'ai pas le choix car il m'est interdit de modifier ou surcharger MaProcedure.
Si vraiment le passage de pointeur te dérange, tu peux déclarer une autre fonction qui appellera MaProcedure.
Code :
void foo(long& l) { MaProcedure(&l); }
Iradrille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 23h28   #5
gbdivers
Responsable C++

 
Homme Guillaume Belz
Biochimiste
Inscription : novembre 2008
Messages : 5 318
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Belz
Âge : 37
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 5 318
Points : 19 518
Points : 19 518
Quelques petites corrections...

Citation:
Le principe de l'allocation dynamique est justement de devoir manager "manuellement" une variable (qu'elle contienne un type de base ou non).
Non, l'allocation dynamique répond surtout à d'autres besoins (utilisation du tas plutôt que la pile, polymorphisme d'héritage). La gestion manuelle n'est qu'une contrainte technique du fait que les anciennes versions du C++ ne proposait pas de pointeurs intelligents et que les personnes ne voulait pas utiliser TR1, boost ou créer leurs propres pointeurs intelligents.
Plus d'excuse maintenant

Citation:
Je vais donc déclarer une variable "dummy" et passer son adresse à la fonction. C'est moche, mais je n'ai pas le choix car il m'est interdit de modifier ou surcharger MaProcedure.
En quoi c'est moche parce que tu crées un objet pour rien. Pourquoi MaProcedure a besoin de lui fournir une objet qui n'est pas utilisé en dehors de MaProcedure ?
C'est peut être un problème de conception de MaProcedure si cela a un sens de pouvoir l'appeler sans avoir besoin de créer un objet. Si c'est pas le cas, c'est un choix volontaire (ou non) du créateur de MaProcedure d'obliger à créer une variable temporaire, plaint toi à lui

Il faut écrire :
Code :
1
2
3
4
5
6
7
// avec variable sur la pile
long l = 1234L;
MaProcedure(&l);
 
// avec pointeur intelligent
unique_ptr<long> p (new long(1234L));
MaProcedure(p.get());
Citation:
Passer par un pointeur au lieu d'une référence est une question de préférence.
Petit bémol, le pointeur donne une petite garantie en moins par rapport à une référence, elle peut être nulle et il est donc impératif de tester avant utilisation :
Code :
1
2
3
4
5
6
7
8
9
voif foo(int * p) {
    if (i) { // obligatoire !!! (là ou a distance...)
        *p = 10; // on utilise p
    }
}
 
void bar(int & r) {
    r = 10; // on utilise r directement
}
Citation:
Si vraiment le passage de pointeur te dérange, tu peux déclarer une autre fonction qui appellera MaProcedure.
Code :
void foo(long& l) { MaProcedure(&l); }
C'est probablement le mieux d'ajouter une indirection pour ne pas avoir à écrire le code pour créer une variable temporaire systématiquement. Par contre, le code oblige à créer une variable temporaire :
Code :
1
2
3
4
5
6
7
8
9
void foo(long& l) { MaProcedure(&l); }
 
long l = 1234L;
 
// appel directe de MaProcedure
MaProcedure(&l);
 
// en passant par foo
MaProcedure(l);
Tu économises simplement le &

Vaut mieux écrire :
Code :
1
2
void foo(long l) { MaProcedure(&l); }
foo(1234L);
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.

Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h03.


 
 
 
 
Partenaires

Hébergement Web