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);
};

10 réponses

1 2 3
Avatar
Gaël Jaffré
classes et structures sont identiques en C++. Et mélanger l'usage de
new/delete et malloc/free n'est pas tellement conseillé.
Donc pour matrice utilise de préférence new/delete.


Il s'agit d'une structure définie dans une bibliothèque d'images que
j'utilise, ayant ses propres fonctions d'initialisation. Je ne peux
donc pas remplacer l'utilisation de malloc (interne) par un new.



Il n'est jamais appelé ou bien il ne doit jamais être appelé ?
Quoi qu'il en soit la désactivation du constructeur par copie permet de
s'en assurer.


Je viens d'en créer un pour être sûr, et il n'est jamais appelé.

Avatar
drkm
writes:

drkm wrote in message
news:...
Gaël Jaffré writes:

Mais même en testant les 2 cas, et en rattrapant l'exception,


Est-elle réellement lancée ?


Il a parlé d'un problème au bout de deux ou trois allocations. Je doute
réelement qu'il ait épuisé toute le mémoire disponible aussi vite.


Effectivement. C'est bien pour cela que je posais la question.

--drkm



Avatar
drkm
Fabien LE LEZ writes:

On Tue, 18 May 2004 10:37:13 +0200, Gaël Jaffré
wrote:

Le programme s'arrête avant même l'appel du constructeur, car
l'affichage (1ère ligne) ne se fait même pas.


Il se peut que la sortie standard soit bufferisée, et que le programme
plante avant que les données à afficher aillent du buffer à l'écran.


Mais il termine sa chaîne par un retour à la ligne. Cela
n'implique-t-il pas un flush (j'ai un gros doute, tout d'un coup) ?

[...]

Signature::Signature(void)


le "void" pour indiquer l'absence d'argument, même s'il est accepté
par le langage C++, c'est plutôt du C.


Et du vieux, encore. Non ?

[...]

printf("__Construction__n");



--drkm


Avatar
kanze
Fabien LE LEZ wrote in message
news:...

[...]
this->nb_couleurs = 0;


Le "this->" est inutile, il ne sert qu'à alourdir le code et à le
rendre moins lisible (ce qui est peut-être le but).


Au moins qu'il a simplifié d'un template, ou qu'il compte le convertir
en template une fois que le code marche. Dans un template, le this->
sert à dire au compilateur que le nom qui suis est dépendant.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Fabien LE LEZ
On 18 May 2004 15:30:16 +0200, drkm
wrote:

Mais il termine sa chaîne par un retour à la ligne. Cela
n'implique-t-il pas un flush (j'ai un gros doute, tout d'un coup) ?


Non.
cout << "hellon";
est différent de
cout << "hello" << endl;

Par contre, pour cerr/stderr, il me semble que la probabilité pour
qu'un n fasse un flush est assez forte.


--
;-)
FLL, Epagneul Breton

Avatar
drkm
Fabien LE LEZ writes:

On 18 May 2004 15:30:16 +0200, drkm
wrote:

Mais il termine sa chaîne par un retour à la ligne. Cela
n'implique-t-il pas un flush (j'ai un gros doute, tout d'un coup) ?


Non.
cout << "hellon";
est différent de
cout << "hello" << endl;


Yep.

Par contre, pour cerr/stderr, il me semble que la probabilité pour
qu'un n fasse un flush est assez forte.


Oui, je crois que tu as raison. Je pense avoir confondu la
différence entre flux C et C++ (le PO utilisait printf), et entre
sortie standard et d'erreur.

--drkm


Avatar
kanze
drkm wrote in message
news:...
Fabien LE LEZ writes:

le "void" pour indiquer l'absence d'argument, même s'il est accepté
par le langage C++, c'est plutôt du C.


Et du vieux, encore. Non ?


Non. La formulation « function() » signifie toujours « nombre et types
de paramètres non spécifiés » en C99.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
drkm wrote in message
news:...
Fabien LE LEZ writes:

le "void" pour indiquer l'absence d'argument, même s'il est accepté
par le langage C++, c'est plutôt du C.


Et du vieux, encore. Non ?


Non. La formulation « function() » signifie toujours « nombre et types
de paramètres non spécifiés » en C99.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
drkm
writes:

drkm wrote in message
news:...

Fabien LE LEZ writes:

le "void" pour indiquer l'absence d'argument, même s'il est accepté
par le langage C++, c'est plutôt du C.


Et du vieux, encore. Non ?


Non. La formulation « function() » signifie toujours « nombre et types
de paramètres non spécifiés » en C99.


Merci. J'étais presque sûr du contraire. Ca m'étonne même pas mal.
Je trouve tout de même bizarre que le C99 ait introduit les tableaux à
longueur dynamique, par exemple, et garde cet archaïsme. Mais ce
n'est que mon avis, en somme pas très éclairé, et déformé par mon
expérience en C++.

PS: Il ne m'a pas semblé nécessaire de cross-poster et de fixer le
fu2 vers fclc. Pensez-y éventuellement si vous répondez à ce message.

--drkm



Avatar
James Kanze
drkm writes:

|> writes:

|> > drkm wrote in message
|> > news:...

|> >> Fabien LE LEZ writes:

|> >> > le "void" pour indiquer l'absence d'argument, même s'il est
|> >> > accepté par le langage C++, c'est plutôt du C.

|> >> Et du vieux, encore. Non ?

|> > Non. La formulation « function() » signifie toujours «
|> > nombre et types de paramètres non spécifiés » en C99.

|> Merci. J'étais presque sûr du contraire. Ca m'étonne
|> même pas mal. Je trouve tout de même bizarre que le C99 ait
|> introduit les tableaux à longueur dynamique, par exemple, et
|> garde cet archaïsme. Mais ce n'est que mon avis, en somme pas
|> très éclairé, et déformé par mon expérience en
|> C++.

Le problème, c'est qu'il existe déjà du code en C ; il en a
même existé lorsqu'on a écrit C90. Et un comité de
normalisation responsable ne casse pas le code existant, dans la
mésure où c'est possible de l'éviter.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
1 2 3