Constructeur par recopie (memory leak ?)

Constructeur par recopie (memory leak ?) - C++ - Programmation

Marsh Posté le 28-01-2010 à 17:35:17    

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
Reply

Marsh Posté le 28-01-2010 à 17:35:17   

Reply

Marsh Posté le 28-01-2010 à 18:02:04    

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
Reply

Marsh Posté le 28-01-2010 à 19:32:31    

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
Reply

Marsh Posté le 01-02-2010 à 10:33:52    

@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.

Reply

Marsh Posté le 01-02-2010 à 11:28:00    

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
Reply

Marsh Posté le 01-02-2010 à 11:45:50    

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
Reply

Marsh Posté le 01-02-2010 à 11:52:10    

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
Reply

Marsh Posté le 01-02-2010 à 16:30:11    

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.

Reply

Marsh Posté le 01-02-2010 à 16:44:40    

@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
Reply

Marsh Posté le 01-02-2010 à 18:09:50    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed