Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1653 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Constructeur par recopie (memory leak ?)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Constructeur par recopie (memory leak ?)

n°1961340
Lan Wezel
Posté le 28-01-2010 à 17:35:17  profilanswer
 

Bonjour,
 
Je voudrais savoir si ce code génère un memory leak à l'appel du constructeur par recopie.
Je suis en train de faire un adapter pour utiliser des struct d'une lib C
 
mon objet de la lib C

Code :
  1. struct model{
  2.   int toto;
  3.   int tata;
  4. };
  5. model * hello(...){
  6.   return new model(); // oui je sais c'est pas new mais malloc, mais c'est pas le pb ici :p
  7. }


 
mon adapter C++

Code :
  1. class MyModel : public MyInterface, public model{
  2. public:
  3.   MyModel(model & aModel):model(aModel),MyInterface(){}
  4. };


 
et enfin l'appel

Code :
  1. MyModel * pMyModel = new MyModel(*hello()); // memory leak ?


 
En fait je me demande s'il y a un memory leak du fait que l'objet model est alloué dans la fonction hello.
Je pense qu'il y en a un car le constructeur par recopie par défaut doit recopier l'objet. Pourriez-vous me le confirmer ?


Message édité par Lan Wezel le 28-01-2010 à 17:37:56
mood
Publicité
Posté le 28-01-2010 à 17:35:17  profilanswer
 

n°1961348
theshockwa​ve
I work at a firm named Koslow
Posté le 28-01-2010 à 18:02:04  profilanswer
 

oui, ca leake. Il n'y a rien de magique, quand tu fais une allocation, on te donne l'adresse allouée. Si tu perds cette adresse, c'est une fuite mémoire.
 
Pourquoi faire des allocations dynamiques dans ton cas plutôt que d'utiliser des temporaires ?


---------------
last.fm
n°1961371
Joel F
Real men use unique_ptr
Posté le 28-01-2010 à 19:32:31  profilanswer
 

unique_ptr<T> :o ou totu autre encapsultaion de T* qui conserve l'ownership


Message édité par Joel F le 28-01-2010 à 19:32:45
n°1961911
Lan Wezel
Posté le 01-02-2010 à 10:33:52  profilanswer
 

@theshockwave :  Ce n'est pas moi qui a codé la partie en C, elle vient d'une lib.
 
@Joel : Je voudrais plutôt éviter la recopie si possible car un objet "model" peut être relativement gros. Il vaudrait mieux que je fasse un wrapper je pense.
 
Merci pour vos réponses en tout cas.

n°1961946
theshockwa​ve
I work at a firm named Koslow
Posté le 01-02-2010 à 11:28:00  profilanswer
 

Faire un wrapper quand on a une lib C et qu'on est en C++, c'est souvent une bonne idée.
 
Par contre ,la manière dont tu pars avec ta classe MyModel est à revoir.
 
Soit tu conserves un pointeur sur l'instance en interne de ta classe parce que tu as des contraintes (du style la lib te propose une fonction d'allocation qui initialise des membres de manière opaque) soit tu agrèges ta structure.
 
Dans les deux cas, voudras-tu vraiment avoir un constructeur de copie ?


---------------
last.fm
n°1961955
Lan Wezel
Posté le 01-02-2010 à 11:45:50  profilanswer
 

C'est pas exactement un constructeur par copie dont j'ai besoin.
J'ai besoin d'un des constructeurs suivants (l'un ou l'autre).

Code :
  1. MyModel(model * pModel);
  2. MyModel(model & rModel);


 
Bof je pense que je vais accepter de faire une copie à la contruction et virer le memory leak en gardant un pointeur sur le retour de hello().
En fait, je trouve pas mal de garder l'adapter sous la forme d'un heritage ça rend le code plus lisible à côté.


Message édité par Lan Wezel le 01-02-2010 à 11:46:35
n°1961960
theshockwa​ve
I work at a firm named Koslow
Posté le 01-02-2010 à 11:52:10  profilanswer
 

virer le memory leak ?
 
Je ne comprends pas ... Tu vas laisser ta fonction hello faire une allocation dynamique pour la copier dans ta structure héritée et libérer aussi sec la mémoire allouée ?


---------------
last.fm
n°1962057
Joel F
Real men use unique_ptr
Posté le 01-02-2010 à 16:30:11  profilanswer
 

Lan Wezel a écrit :

@Joel : Je voudrais plutôt éviter la recopie si possible car un objet "model" peut être relativement gros. Il vaudrait mieux que je fasse un wrapper je pense.


 
unique_ptr<T> ne copie rien, il fait juste le delete tout seul.

n°1962062
Lan Wezel
Posté le 01-02-2010 à 16:44:40  profilanswer
 

@theshockwave : ouais ce qui est l'équivalent de ce que propose Joel sauf que j'ai la flemme de tirer boost juste pour un unique_ptr donc je le fais à la main. Je n'ai aucune maitrise sur hello() elle est dans une lib.
 
@Joel : j'ai vu dans la doc ce qu'il fait, ce que je voulais dire c'est que le unique_ptr résout le memory leak, mais pas le fait que j'ai pas très envie de recopier l'objet de la lib. Mais bon finalement je m'y suis résolu car ce sera juste à l'initialisation ce truc.


Message édité par Lan Wezel le 01-02-2010 à 16:45:30
n°1962084
Joel F
Real men use unique_ptr
Posté le 01-02-2010 à 18:09:50  profilanswer
 

y a toujours bcp pour extraire des sous modules de boost.
Inclure le .hpp dans ton code est aussi envisageable vu la license faible de boost


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Constructeur par recopie (memory leak ?)

 

Sujets relatifs
zip lib: memory exceeded sur les gros fichiers zipConstructeur Optimisé
[PERL] Out of memory sur Win7 x64 [RESOLU]Constructeur Tableau - Merci pour votre aide ! :-)
excpetion dans le constructeurC++ pointeur, constructeur, attributs
classe abstraite et constructeurFatal error: Allowed memory size of 33554432 bytes exhausted
[C++] Utiliser le pointeur this dans le constructeurrecopie texte d'un champ dans un tableau
Plus de sujets relatifs à : Constructeur par recopie (memory leak ?)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR