OVH Cloud OVH Cloud

Coredump après un appel de new

21 réponses
Avatar
Gaël Jaffré
Bonjour,

J'ai défini une classe Signature qui utilise plusieurs structures
personnelles (mais aucune autre classe).
Mon problème, c'est que mon programme plante après 2 ou 3 créations
d'objets. Après avoir créé dynamiquement 2 objets, l'allocation me
génère un coredump (sous Linux), avant même l'appel du constructeur.

Signature *s = new Signature();
// ou encore
Signature *s = (Signature*)malloc(sizeof(Signature));

alors que Signature s; fonctionne sans erreur.

Je croyais qu'une allocation mémoire impossible renvoyait NULL, mais
ne générait pas d'erreur.
Quelqu'un comprend t-il comment le programme peut planter à la
création de l'objet ?

Merci


La définition de ma classe est la suivante :

#define SIGN_NB_VAL_MAX 64

class Signature
{
public:
inline Signature(void);
inline Signature(IplImage *im_segmentee);
inline ~Signature(void);
void remplir(IplImage *im_segmentee);
void remplir_completement(IplImage *im_segmentee);
void afficher(void) const;
inline int operator ==(Signature & s2) const;
inline Signature & operator =(const Signature & s);
friend inline double mesure_similarite(const Signature *s1, const
Signature *s2);

private:
couleur couleurs[SIGN_NB_VAL_MAX];
int nb_occ[SIGN_NB_VAL_MAX];
double frequences[SIGN_NB_VAL_MAX];
CvMat *matrice;
int nb_couleurs;
int nb_pixels;
CvMat *mat_signature(void);
};

1 réponse

1 2 3
Avatar
Alexandre
bonjour,

Signature *s = new Signature();
// ou encore
Signature *s = (Signature*)malloc(sizeof(Signature));


Attention, ce n'est PAS la même chose. new Signature() va allouer de la
mémoire ET appeler le constructeur de signature.
malloc ne fait qu'allouer la mémoire, n'appelle PAS le constructeur.


alors que Signature s; fonctionne sans erreur.

Je croyais qu'une allocation mémoire impossible renvoyait NULL, mais
ne générait pas d'erreur.


normalement une exception std::bad_alloc est levée.

Quelqu'un comprend t-il comment le programme peut planter à la
création de l'objet ?


il faudrait avoir le constructeur, mais vu que ça plante aussi avec malloc,
ça doit venir d'ailleurs.


Merci


La définition de ma classe est la suivante :

#define SIGN_NB_VAL_MAX 64

class Signature
{
public:
inline Signature(void);
inline Signature(IplImage *im_segmentee);
inline ~Signature(void);
void remplir(IplImage *im_segmentee);
void remplir_completement(IplImage *im_segmentee);
void afficher(void) const;
inline int operator ==(Signature & s2) const;
inline Signature & operator =(const Signature & s);
friend inline double mesure_similarite(const Signature *s1, const
Signature *s2);

private:
couleur couleurs[SIGN_NB_VAL_MAX];
int nb_occ[SIGN_NB_VAL_MAX];
double frequences[SIGN_NB_VAL_MAX];
CvMat *matrice;
int nb_couleurs;
int nb_pixels;
CvMat *mat_signature(void);
};


1 2 3