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

10 réponses

1 2 3
Avatar
xavier
fabrizio a dit le 10/02/2005 12:01:
auriez vous quelque idée ?


A priori, je dirais que la mémoire est déjà corrompue avant l'appel à
malloc ou new.
Regarde du coté des écritures sur des objets alloués dynamiquement
précédent l'appel.

Si le code unique :

! class dummyclasse { /* ... */ };
!
! int main() {
! dummyclasse * p = new dummyclasse (1, 2);
! delete p;
! }

plante, une étude du code du constructeur est nécéssaire pour déterminer
le problème.

xavier

Avatar
fabrizio
A priori, je dirais que la mémoire est déjà corrompue avant l'appel à
malloc ou new.


ca veut dire quoi que la mémoire est "corrompue" ?
ca peut venir de quoi ?


Regarde du coté des écritures sur des objets alloués dynamiquement
précédent l'appel.

Si le code unique :

! class dummyclasse { /* ... */ };
!
! int main() {
! dummyclasse * p = new dummyclasse (1, 2);
! delete p;
! }

plante, une étude du code du constructeur est nécéssaire pour déterminer
le problème.


ah oui j'avais oublié. ceci fonctionne.
donc je pense que le problème n'est pas dans le constructeur.
ceci étant corroboré par la fait que un simple malloc provoque le même
segfault.

merci pour ta réponse

Avatar
flure
A priori, je dirais que la mémoire est déjà corrompue avant l'appel à
malloc ou new.



ca veut dire quoi que la mémoire est "corrompue" ?
ca peut venir de quoi ?


Ça veut dire que tu as une fuite mémoire, ou un débordement quelque part
avant ton new. Utilise un outil comme Valgrind pour le repérer ...
Si tu es sur un système Linux, tu as Alleyoop qui est un front-end à
Valgrind, très pratique à utiliser.
Personnellement j'utilise régulièrement ce genre d'outils pour corriger
les erreurs (en général d'inattention) dans mes allocations/déallocations.

--
Florent "flure" C.
http://flure.free.fr


Avatar
xavier
fabrizio a dit le 10/02/2005 12:26:
ca veut dire quoi que la mémoire est "corrompue" ?


Pour pouvoir fonctionner correctement malloc maintient une structure de
donnée, invisible pour l'utilisateur, qui lui indique quelle zone de la
mémoire est disponible ou indisponible.

Une action dans ton programme a écrit une donnée dans cette structure.
Elle est donc corrompue et entraîne le plantage de malloc.

ca peut venir de quoi ?


La plupart du temps, il s'agit d'une écriture hors limite. Par exemple :

! char * p = malloc(10);
! p[-1] = 0; // écriture avant la zone, grand risque de corruption
! p[10] = 0; // écriture après la zone, idem.

Pour abonder dans le sens de flure, il existe tout un tas de
bibliothèque et outils qui te permettent de vérifier de manière
automatique ce genre d'erreur. Valgrind en est un particulièrement bien
fichu.

xavier

Avatar
flure
! p[-1] = 0; // écriture avant la zone, grand risque de corruption


C'est possible, ça ???
Je pensais qu'un index de tableau était obligatoirement unsigned int ?

C'est une question, pas une critique, bien sûr :)

--
Florent "flure" C.
http://flure.free.fr

Avatar
xavier
flure a dit le 10/02/2005 13:31:

! p[-1] = 0; // écriture avant la zone, grand risque de corruption



C'est possible, ça ???


Oui.

exemple :

! #include <iostream>
! #include <iterator>
! #include <algorithm>
!
! int main() {
! char buffer[3] = {1, 2, 3};
! char * p = buffer + 2;
! p[-1] = 4;
! std::copy(buffer, buffer + 3,
! std::ostream_iterator<int>(std::cout, " "));
! std::cout << std::endl;
! }

Je pensais qu'un index de tableau était obligatoirement unsigned int ?


Ben non.

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

xavier


Avatar
fabrizio
merci à xavier et flure pour vos réponses.
Avatar
nmartin
Je pensais qu'un index de tableau était obligatoirement unsigned int ?



Ben non.

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

xavier


j'ai aussi vu qu'avec gcc ce code compilait :

int main(...){
int N;
cin >> N;
char buffer[N];

...
}

nico


Avatar
Alexandre
"flure" a écrit dans le message de news:
420b5494$0$5212$
! p[-1] = 0; // écriture avant la zone, grand risque de corruption


C'est possible, ça ???
Je pensais qu'un index de tableau était obligatoirement unsigned int ?

non, un entier étant par défaut signé, il est logique que [] attende un int.

(donc signed int).


Avatar
Jean-Marc Bourguet
flure writes:

! p[-1] = 0; // écriture avant la zone, grand risque de corruption


C'est possible, ça ???


Oui.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


1 2 3