Memory leak sur const MyStrut* MyStruct

citronz Messages postés 2 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 9 février 2003 - 8 févr. 2003 à 19:27
jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003 - 10 févr. 2003 à 14:45
Salut,

J'ai un memory leak sur une déclaration et je n'arrives pas à l'enlever :

(dll de type ATL)
déclaration : const MyStruct* MyStruct;
au constructeur : MyStruct = new MyStruct;
au destructeur : rien... si je mets un <delete MyStruct;> j'ai un joli debug assertion failed...

Une solution pour virer la chose ?

Merci d'avance

Philippe

7 réponses

jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003
9 févr. 2003 à 00:19
> Salut,
>
> J'ai un memory leak sur une déclaration et je n'arrives pas à l'enlever :
> déclaration : const MyStruct* MyStruct;
> au constructeur : MyStruct = new MyStruct;
> au destructeur : rien... si je mets un <delete MyStruct;> j'ai un joli debug assertion failed...
>
> Une solution pour virer la chose ?

Poster du code pourrait peut-être nous permettre de t'aider un peu plus. Mais vois ceci :

struct maStruct
{
int a, b, c;
};

maStruct *s = new maStruct;

// utilisation de s

delete s;

Sans le delete, il y aurait memory leak. Maintenant, tu sembles utiliser new dans le constructeur et delete dans le destructeur de la struct. Mais que construis-tu? Un pointeur dans la struct? :

struct maStruct
{
char* mastring;

maStruct()
{
mastring = new String[30];
}

~maStruct()
{
delete[] mastring;
}
};

Sinon, quoi? N'oublie pas que si tu new un tableau, il te faut utiliser delete[].

Bonne journée,
0
citronz Messages postés 2 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 9 février 2003
9 févr. 2003 à 10:20
Oui j'ai été un peu mesquin sur le bout de code ... Je pensais que le problème était standard ... En voici + :

1) Dans le fichier .h de ma classe :

protected:
const Mp3_Headerinfo* m_MpegHeader;

2) Dans le fichier .h lié

# define ID3_STRUCT(S) struct S

ID3_STRUCT(Mp3_Headerinfo)
{
Mpeg_Layers layer;
Mpeg_Version version;
MP3_BitRates bitrate;
Mp3_ChannelMode channelmode;
Mp3_ModeExt modeext;
Mp3_Emphasis emphasis;
Mp3_Crc crc;
uint32 vbr_bitrate; // avg bitrate from xing header
uint32 frequency; // samplerate
uint32 framesize;
uint32 frames; // nr of frames
uint32 time; // nr of seconds in song
bool privatebit;
bool copyrighted;
bool original;
};

3) Dans le constructeur de ma classe :

m_MpegHeader = new Mp3_Headerinfo();

4) Dans le destructeur :

Rien justement sinon çà plante ...

Une idée ?
0
cs_vieuxLion Messages postés 455 Date d'inscription samedi 26 octobre 2002 Statut Membre Dernière intervention 6 avril 2004 8
9 févr. 2003 à 17:36
Bonjour,
tu as ta réponse je crois

évite de déclarer const un pointeur sur une zone que tu compte détruire par delete

maStruct *s = new maStruct; et delete s; OK
const maStruct *s = new maStruct; et delete s; KO
0
jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003
10 févr. 2003 à 06:50
Ne pas poster par dessus un autre post, ça nuit à la visibilité. Réarrangé.

> > > J'ai un memory leak sur une déclaration et je n'arrives pas à l'enlever :
> > > déclaration : const MyStruct* MyStruct;
> > > au constructeur : MyStruct = new MyStruct;
> > > au destructeur : rien... si je mets un <delete MyStruct;> j'ai un joli debug assertion failed...
> > >
> > > Une solution pour virer la chose ?
> >
> > Poster du code pourrait peut-être nous permettre de t'aider un peu plus. Mais vois ceci :

<snip>

> 1) Dans le fichier .h de ma classe :
>
> protected:
> const Mp3_Headerinfo* m_MpegHeader;

protected, ça veut dire que très probablement d'autres classes héritent de cette classe X. Ton destructeur est-il virtuel? Sinon il ne sera jamais appelé :

class A
{
public:
~A();
};

class B : public A
{
public:
~B();
};

A *b = new B;
delete b;

Au delete, ~A() n'est pas appelé s'il n'est pas virtuel.

> 2) Dans le fichier .h lié
>
> # define ID3_STRUCT(S) struct S

Les defines sont à éviter et celui-ci est particulièrement inutile.

<snip>

> 3) Dans le constructeur de ma classe :
>
> m_MpegHeader = new Mp3_Headerinfo();

ok

> 4) Dans le destructeur :
>
> Rien justement sinon çà plante ...

Si ta classe A utilise new dans son constructeur, il devrait y avoir un delete dans son destructeur (à moins de le faire ailleurs) et celui-ci doit être virtuel si tu utilises une classe B dérivée de A.

Sinon, premièrement ton protected: est inutile puisque rien en dérive et deuxièmement, tu devrais avoir un new dans le ctor et un delete dans le dtor (encore, si c'est là que tu le delete).

De plus, poste du code qui *compile*, qu'on puisse vérifier quelque chose.

Bonne journée,

Jonathan Mcdougal
Montréal, Québec
mcdougalljonathan@hotmail.com
http://www.multimania.com/utopiasoftware
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003
10 févr. 2003 à 07:07
> Bonjour,
> tu as ta réponse je crois
>
> évite de déclarer const un pointeur sur une zone que tu compte détruire par delete
>
> maStruct *s = new maStruct; et delete s; OK
> const maStruct *s = new maStruct; et delete s; KO

À ma connaissance, deleter un pointer const est correct et même nécessaire. La constance d'un pointeur ne concerne pas sa destruction, mais bien sa vie. Une recherche rapide dans le standard ne m'a rien donnée, si tu pouvais éclairer ma lanterne...

const int *p = new int; //memory leak assuré?

Jonathan Mcdougal
Montréal, Québec
mcdougalljonathan@hotmail.com
http://www.multimania.com/utopiasoftware
0
cs_vieuxLion Messages postés 455 Date d'inscription samedi 26 octobre 2002 Statut Membre Dernière intervention 6 avril 2004 8
10 févr. 2003 à 09:33
Tu as raison, désolé
je reformule
const maStruct * s déclare un pointeur sur const
maStruct* const s déclare un pointeur const et c'est celui là qu'il convient d'utiliser
0
jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003
10 févr. 2003 à 14:45
> Tu as raison, désolé
> je reformule
> const maStruct * s déclare un pointeur sur const
> maStruct* const s déclare un pointeur const et c'est celui là qu'il convient d'utiliser

int *const p = new int;
delete p; // ok

const int *p2 = new int;
delete p2; // ok

const int *const p3 = new int;
delete p3; // ok

En tout cas à ma connaissance.
0
Rejoignez-nous