citronz
Messages postés2Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention 9 février 2003
-
8 févr. 2003 à 19:27
jonathanmcdougall
Messages postés64Date d'inscriptiondimanche 9 février 2003StatutMembreDerniè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...
jonathanmcdougall
Messages postés64Date d'inscriptiondimanche 9 février 2003StatutMembreDerniè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[].
jonathanmcdougall
Messages postés64Date d'inscriptiondimanche 9 février 2003StatutMembreDerniè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.
jonathanmcdougall
Messages postés64Date d'inscriptiondimanche 9 février 2003StatutMembreDerniè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...
cs_vieuxLion
Messages postés455Date d'inscriptionsamedi 26 octobre 2002StatutMembreDernière intervention 6 avril 20048 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
jonathanmcdougall
Messages postés64Date d'inscriptiondimanche 9 février 2003StatutMembreDerniè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