Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probeleme memoire, heritage et polymorphisme

5 réponses
Avatar
Drakkhen
Bonjour,

J'ai un probleme de memoire que je n'arrive pas a resoudre.

Soit deux classes : DateCalc et DateCalcDerivee
avec DateCalcDerivee heritant en public de DateCalc

dans DateCalcDerivee je declare deux variables privees :
- double m_PrevDen;
- int * IsBumped;

et rien d'autre.

Si j'alloue une valeur a m_PrevDen dans le constructeur, alors a la
liberation de la memoire ca plante (en sortant du destructor). En revanche,
je peux allouer la memoire du tableau IsBumbed, changer les valeurs...
liberer le tableau, tout marche.

Donc il semblerait que la variable privee m_PrevDen ne soit pas allouee en
memoire !


Pour creer mon objet, je fais

DateCalc * o;
o = new DateCalcDerivee;


si je fais DateCalc * o;
o = new DateCalc;

Je m'en sers normalement : o->...

tout marche bien, je passe par les fonctions virtuelles overloadees
normalement.... Tant que je ne touche pas a une variable privee qui aurait
du etre allouee par le constructor tout va bien. Si j'en touche une alors a
la liberation de la memoire au moment de sortir du destrutor : patatra.

Tous les problemes viennent donc de l'implementation de la classe derivee
apparemment. Pourtant la classe "mere" a bien un destructeur virtuel et je
passe bien dans chaque destructeur et constructeur. J'ai tout foutu en
commentaire et le probleme vient vraiment de mettre une valeur dans une
variable privee.

Il va sans dire que j'ai ecris pour tester un petit projet avec 4 classes
dedans pour recreer le probleme et evidemment tout va bien !

Vous auriez une idee svp ? Une piste pour trouver d'ou peut venir le
probleme, une option de compilation ???

Merci

5 réponses

Avatar
Benoit Rousseau
Drakkhen wrote:
Il va sans dire que j'ai ecris pour tester un petit projet avec 4 classes
dedans pour recreer le probleme et evidemment tout va bien !
Les voir serait surement plus explicite que ta longue dissertation...




--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

Avatar
Rémy
"Drakkhen" a écrit dans le message de
news:3fd9f0c7$0$9922$
Bonjour,

J'ai un probleme de memoire que je n'arrive pas a resoudre.
...


Vous auriez une idee svp ? Une piste pour trouver d'ou peut venir le
probleme, une option de compilation ???

Bonsoir,


Quel OS, quel compilateur ?

Rémy

Avatar
Drakkhen
Comme tu l'avais compris, je ne peux pas donner les classes en entier.

Voici les classes "epurees".


INTERFACES

class CSD_BondDateACTACTTrue :
public CSD_BondDateCalc
{
public:
CSD_BondDateACTACTTrue(void);
~CSD_BondDateACTACTTrue(void);
private:
int * m_IsBumpedDate;
double m_PreviousDen;
};

class CSD_BondDateCalc
{
public:
CSD_BondDateCalc(void) {}
virtual ~CSD_BondDateCalc(void) {}
};



IMPLEMENTATION

CSD_BondDateACTACTTrue::CSD_BondDateACTACTTrue(void)
{ m_PreviousDen = 1.0; // a cause de ceci la classe plante
m_IsBumpedDate = 0; // celui ne cree aucun probleme, je peux allouer de
la memoire.... tout va bien
}
CSD_BondDateACTACTTrue::~CSD_BondDateACTACTTrue(void)
{
}





voila comment je les utilise

CSD_BondDateCalc *oBondDate;


if (...)
oBondDate = new CSD_BondDateACTACTTrue;
else
oBondDate = new CSD_BondDateCalc;

delete oBondDate;
Avatar
Drakkhen
Win XP Pro,

Compilo de VS.Net
Avatar
Guillaume Gourdin
Si j'alloue une valeur a m_PrevDen dans le constructeur, alors a la
liberation de la memoire ca plante (en sortant du destructor). En
revanche,

je peux allouer la memoire du tableau IsBumbed, changer les valeurs...
liberer le tableau, tout marche


Pourquoi tu veux "allouer" ta variable m_PrevDen qui n'est pas un
pointeur... Tu n'as pas besoin de faire un new...

Par exemple :

class DateCalcDerivee : public DateCalc
{
public:
DateCalcDerivee(double PrevDen, int nSize){m_PrevDen = PrevDen; IsBumped new int[nSize];};
virtual ~DateCalcDerivee(){delete[] IsBumped;};

private:
double m_PrevDen;
int * IsBumped;
}