begin process at 2012 05 30 04:15:50
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

memory leak sur const MyStrut* MyStruct


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

memory leak sur const MyStrut* MyStruct

samedi 8 février 2003 à 19:27:39 | memory leak sur const MyStrut* MyStruct

citronz

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

dimanche 9 février 2003 à 00:19:10 | Re : memory leak sur const MyStrut* MyStruct

jonathanmcdougall

> 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,

--
Jonathan Mcdougal
Montréal, Québec
mcdougalljonathan@hotmail.com
http://www.multimania.com/utopiasoftware
dimanche 9 février 2003 à 10:20:24 | Re : memory leak sur const MyStrut* MyStruct

citronz

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 ?

-------------------------------
Réponse au message :
-------------------------------

> > 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,
>
> --
> Jonathan Mcdougal
> Montréal, Québec
> mcdougalljonathan@hotmail.com
> http://www.multimania.com/utopiasoftware
dimanche 9 février 2003 à 17:36:56 | Re : memory leak sur const MyStrut* MyStruct

vieuxLion

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



-------------------------------
Réponse au message :
-------------------------------

> 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 ?
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > > 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,
> >
> > --
> > Jonathan Mcdougal
> > Montréal, Québec
> > mcdougalljonathan@hotmail.com
> > http://www.multimania.com/utopiasoftware
>
lundi 10 février 2003 à 06:50:23 | Re : memory leak sur const MyStrut* MyStruct

jonathanmcdougall

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
lundi 10 février 2003 à 07:07:06 | Re : memory leak sur const MyStrut* MyStruct

jonathanmcdougall


> 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

lundi 10 février 2003 à 09:33:22 | Re : memory leak sur const MyStrut* MyStruct

vieuxLion

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



-------------------------------
Réponse au message :
-------------------------------

>
> > 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
>
>
lundi 10 février 2003 à 14:45:00 | Re : memory leak sur const MyStrut* MyStruct

jonathanmcdougall

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

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




Cette discussion est classée dans : const, memory, leak, mystruct, mystrut


Répondre à ce message

Sujets en rapport avec ce message

_tempnam & memory leak [ par magic_Nono ] ceci n'est pas une question mais juste une info, qui vous éviteras peut etre de perdre du temps résultat de 2 h de recherche d'un memory leak le pro wchar [ par xterminhate ] j'ai un objet de type ( const wchar_t * ). Je voudrais passer cet objet en paramètre d'une fonction f( const char * ). Existe-t-il une fonction de co convertir AnsiString vers const char * HELP [ par alexsierro ] [C++ Erreur] Unit1.cpp(22): E2034 Impossible de convertir 'AnsiString' en 'const char *' Je ne parvient pas à utiliser un texte d'un edit(AnsiString) Erreur incomprise [ par Bason_sensei ] // User.h #ifndef _USER_H_ #define _USER_H_ #include using namespace std; #include "FileUser.h" class User{     public :         User();< Read Memory [ par e0091 ] Salut a tous j'aimerais savoir quel est la formule pour que je puisse lire et ecrire dans la memoire d'un jeu? erreur de compilation [ par cpp_devlopper ] bonjour,je suis un nouvel utilisateue de Microsoft visual studio, je l'ai essayé avec un programme "point.cpp"mais quand je le compile il ne reconnait Convertir unsigned long en const char * [ par sman0 ] bonjour je cherche a convertir un unsigned long en char pour l'afficher dans une MessageBox comment puis-je proceder ? Fonction à nbr d'arguments variable [ par Xilofeon ] Bonjour.   Alors gros problème.J'utilise des fonctions à nombres variables d'arguments. Alors je vais vous montré le code est expliqué aprés car je vo un vector d'objet qui refuse d'être const pour utiliser les méthodes de l'objet [ par Icarius44 ] Struct array en argument [ par Gabi ] J'ai un problème avec les arrays de struct en argument (o rly ?). Quand j'en passe un, la valeur que cela donne dans la fonction n'est pas correcte (m


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales