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 ???
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/
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/
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/
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
"Drakkhen" <spam@cnil.fr> a écrit dans le message de
news:3fd9f0c7$0$9922$fa0fcedb@lovejoy.zen.co.uk...
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 ???
"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
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;
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;
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;
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; }
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;};
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;};