OVH Cloud OVH Cloud

que faire quand new plante?

21 réponses
Avatar
fabrizio
Bonjour,

je cherche des pistes pour comprendre pourquoi mon programme
me sort un segmentation fault.
les symptomes sont les suivants :
dans une fonction j'ai un truc comme ça :
dummyclasse* ptr = new dummyclasse(1,2);

qui, apparemment, provoque un segmentation fault.
j'ai remplacé ceci par :
dummyclasse* ptr = (dummyclasse*)malloc(sizeof(dummyclasse));

ce qui me provoque le même segfault

en revanche :
dummyclasse a(1,2);
ne pose pas de problème

auriez vous quelque idée ?

Fabrice

1 réponse

1 2 3
Avatar
kanze
Jean-Marc Bourguet wrote:
xavier writes:

! $ g++ -ansi -Wall -Werror -pedantic -o test_array test_array.cpp
! $ test_array
! 1 4 3
! $


Ca prouve quoi? Si le -1 etait converti implicitement en
unsigned, le comportement serait a priori le meme (et sans
conversion implicite, p[1] serait une erreur). Pour voir une
difference, il faudrait par exemple executer le prog avec des
int de 32 bits sur un systeme ou l'espace virtuel est de 64
bits.


Et encore. J'ai fait l'essai avec Sun CC (option -xarch=v9).
J'ai ajouté un :

! std::cout << "sizeof( int ) = " << sizeof( int )
! << ", sizeof( char* ) = " << sizeof( char* )
! << ", sizeof( size_t ) = " << sizeof( size_t )
! << std::endl ;

à la fin, pour en être sûr :

! 1 4 3
! sizeof( int ) = 4, sizeof( char* ) = 8, sizeof( size_t ) = 8

Mais... Ça ne prouve toujours rien. La conversion de int en
size_t (ici, unsigned long) est bien défini, et donne MAX_ULONG.
Sur ma machine, les pointeurs sont en fait des unsigned long
(adressage linéaire) et l'arithmétique sur pointeurs utilise les
mêmes instructions machine que l'arithmétique sur unsigned long.
Or, la définition de l'arithmétique sur unsigned long (dans la
norme) fait qu'ajouter MAX_ULONG a exactement le même résultat
que de soustraire 1.

Pour voir une différence, il faudrait avoir une machine où
l'arithmétique sur des pointeurs ne se fait pas de façon modulo.
Chose que je n'ai jamais vu.

Mais de toute façon, c'est sans importance. Comme l'a montré
Falk, la norme dit clairement ici que c'est la valeur de
l'expression entière qu'il faut ajouter au pointeur, non cette
valeur convertie en size_t (ou n'importe quel autre type).

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


1 2 3