Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2704 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Qu'est ce qui peut faire planter un new ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Qu'est ce qui peut faire planter un new ?

n°674386
leFab
Itadakimasu !!!
Posté le 15-03-2004 à 18:28:04  profilanswer
 

Hello,
 
Voilà le pb : je veux allouer un tableau de 8 int tout con.
 

Code :
  1. int* tab = new int[8];


 
Cette ligne toute simple plante  :heink:  
 
Dans un autre cas, le new ne plante pas, mais renvoie NULL !
 
Merci.
 
EDIT : tab -> int


Message édité par leFab le 15-03-2004 à 18:33:48
mood
Publicité
Posté le 15-03-2004 à 18:28:04  profilanswer
 

n°674395
chrisbk
-
Posté le 15-03-2004 à 18:33:02  profilanswer
 

new int, pas new tab

n°674398
leFab
Itadakimasu !!!
Posté le 15-03-2004 à 18:34:16  profilanswer
 

chrisbk a écrit :

new int, pas new tab


 
Euh oui évidemment, tapé trop vite. EDIT fait.

n°674422
Kristoph
Posté le 15-03-2004 à 18:52:40  profilanswer
 

En général, c'est une corruption des structures internes de l'allocateur mémoire. Double free/delete, ecriture en dehors des zones mémoires allouées etc...
 
Il y a des outils qui servent à trouver ce genre de problèmes. Des trucs comme valgrind sous Linux ou Purify sous Windows.

n°674424
leFab
Itadakimasu !!!
Posté le 15-03-2004 à 18:54:53  profilanswer
 

Kristoph a écrit :

En général, c'est une corruption des structures internes de l'allocateur mémoire. Double free/delete, ecriture en dehors des zones mémoires allouées etc...
 
Il y a des outils qui servent à trouver ce genre de problèmes. Des trucs comme valgrind sous Linux ou Purify sous Windows.


 
Merci pour l'info  :jap:  
Cette corruption peut elle survenir à cause d'autres variables mal désallouées ou non-désalouées un peu avant dans le code ?

n°674428
Kristoph
Posté le 15-03-2004 à 19:01:26  profilanswer
 

Une variable non désallouée ne crée pas ce genre de problèmes en général.

n°674518
jagstang
Pa Capona ಠ_ಠ
Posté le 15-03-2004 à 20:50:22  profilanswer
 

une delete sur un null n'a pas d'effet. Par contre et d'une manière générale, il faut tester si != null après chaque new...

n°674520
Kristoph
Posté le 15-03-2004 à 20:52:40  profilanswer
 

JagStang a écrit :

une delete sur un null n'a pas d'effet. Par contre et d'une manière générale, il faut tester si != null après chaque new...


 
Il vaut mieux activer les exceptions plustot. Le temps ou il fallait tester les valeur de retour de chaque fonction succeptible d'échouer est passé et c'est tant mieux.

n°674523
jagstang
Pa Capona ಠ_ಠ
Posté le 15-03-2004 à 20:55:18  profilanswer
 

oui une bonne gestion d'exception est bien mieux. Mais il ne vaut mieux pas trop s'appuyer dessus quand c'est pas nécessaire.
 
Je te rassure, je suis du même avis que toi.

n°674545
gilou
Modérateur
Modosaurus Rex
Posté le 15-03-2004 à 21:21:59  profilanswer
 

leFab a écrit :


 
Merci pour l'info  :jap:  
Cette corruption peut elle survenir à cause d'autres variables mal désallouées ou non-désalouées un peu avant dans le code ?

souvent en C, c'est a cause d'une mauvaise ecriture sur la pile, a l'adresse de retour de la fonction en cours.
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
mood
Publicité
Posté le 15-03-2004 à 21:21:59  profilanswer
 

n°674549
leFab
Itadakimasu !!!
Posté le 15-03-2004 à 21:24:40  profilanswer
 

Et il y a des causes connues de ce genre de pb ? En gros, que puis je faire pour y rémédier ?


Message édité par leFab le 15-03-2004 à 21:25:02
n°674733
gilou
Modérateur
Modosaurus Rex
Posté le 16-03-2004 à 00:52:30  profilanswer
 

Verifier que tu as pas ecrit en dehors des structures que tu as alloué.  
Une autre cause a ce type de pb que j'ai vu (en C++ sous unix), c'est le fait d'utiliser des librairies compilees avec un compilo different de celui utilise pour compiler son code, et de voir le linker s'emmeler les pinceaux pour appeller le bon runtime (celui de la librairie etant different de celui du code ecrit). Bon, ca, par contre, ca se solutionne.
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°674887
frenchkiss
Posté le 16-03-2004 à 11:36:08  profilanswer
 

ouai enfin deja faire un new int[8] lol
...
si tu veux savoir si t as plus de place au moment de l allocation tu peut toujours faire un truc du style
 
 
void mo_new_handler_que_jaime(){
cerr<<" suite a une greve de memoire l'allocation ne peut avoir lieu" << endl;
exit(1);
}
 
au debut de ton main
set_new_handler(mo_new_handler_que_jaime)
 
en prenant soin d include new
 
pis j espere que tu fait bien un delete []tab;
et pas un delete tab pour toutes tes array..
 
 
et quand tu dis qua ca plante ca fait quoi exactement.
 
FK

n°674906
leFab
Itadakimasu !!!
Posté le 16-03-2004 à 12:04:35  profilanswer
 

frenchkiss a écrit :

ouai enfin deja faire un new int[8] lol
...
si tu veux savoir si t as plus de place au moment de l allocation tu peut toujours faire un truc du style
 
 
void mo_new_handler_que_jaime(){
cerr<<" suite a une greve de memoire l'allocation ne peut avoir lieu" << endl;
exit(1);
}
 
au debut de ton main
set_new_handler(mo_new_handler_que_jaime)
 
en prenant soin d include new
 
pis j espere que tu fait bien un delete []tab;
et pas un delete tab pour toutes tes array..
 
 
et quand tu dis qua ca plante ca fait quoi exactement.
 
FK
 


 
ouai enfin deja faire un new int[8] lol
 
?? Je ne comprends pas. Tu n'arrives pas à imaginer de cas d'allocation dynamique où tu puisses avoir besoin d'allouer dynamiquement 8 int ? :??:  
 
Ce que tu me dis là (le coup du handler) ne permet pas de savoir si je manque de place, et de toute façon, si je manque de place au moment de l'allocation, le new renvoie NULL, mais ne fait pas planter le prog.  
 
Pour m'assurer que j'avais bien assez de mémoire au moment de l'allocation, je fais un new int[400] juste au dessus (c'est bourrin mais ça à l'avantage d'être rapide à mettre en place comme test), et ça passait à chaque fois.
 
Le message d'erreur est un truc du style "DAMAGE after normal block (#363)..." bref, rien de bien explicite, comme d'habitude.
 
Faire ou non des delete correct n'a à priori pas de rapport avec ce pb.

n°674927
gilou
Modérateur
Modosaurus Rex
Posté le 16-03-2004 à 12:28:37  profilanswer
 

>> Le message d'erreur est un truc du style "DAMAGE after normal block (#363)..." bref, rien de bien explicite,  
 
Tres explicite, au contraire. C'est quoi le bloc qui declenche cette erreur?
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°674964
frenchkiss
Posté le 16-03-2004 à 12:57:12  profilanswer
 

>Ce que tu me dis là (le coup du handler) ne permet pas de savoir si je manque de place,
 
ben si justement..
quand il n'y a plus diplace si le pointeur sur cette fonction est non nul alors elle est aplelle ...
 
quand a l'erreur , ben elle est qd meme pas banale donc d'autant plus utile.
 
et non , j arrive pas a imaginer une appli avec un new int[8] qqd part . ( 8 c'est pas vraiment dynamique)
 
>Faire ou non des delete correct n'a à priori pas de rapport avec ce pb.  
... nan t as raison , apres tout pourquoi on s embete a faire des delete ..

n°674993
Kristoph
Posté le 16-03-2004 à 13:22:44  profilanswer
 

Au contraire, confondre un appel a "delete" avec un appel a "delete []" peux causer des corruptions mémoire.

n°674997
leFab
Itadakimasu !!!
Posté le 16-03-2004 à 13:32:34  profilanswer
 

frenchkiss a écrit :

>Ce que tu me dis là (le coup du handler) ne permet pas de savoir si je manque de place,
 
ben si justement..
quand il n'y a plus diplace si le pointeur sur cette fonction est non nul alors elle est aplelle ...
 
quand a l'erreur , ben elle est qd meme pas banale donc d'autant plus utile.
 
et non , j arrive pas a imaginer une appli avec un new int[8] qqd part . ( 8 c'est pas vraiment dynamique)
 
>Faire ou non des delete correct n'a à priori pas de rapport avec ce pb.  
... nan t as raison , apres tout pourquoi on s embete a faire des delete ..
 


 
Ben si c'est dynamique (j'ai juste mis 8 parce que dans le cas précis où ça plante, la variable que je passe dans le tableau vaut 8, je pensais que tt le monde aurait compris ça [:spamafote])
 
Pour le coup des delete, évidemment qu'on désalloue les tableaux avec delete[], mais ça c'est qd même la base des bases (merci de me le rappeler mais bon, j'ai qd même pas mal d'EXP en prog). Mais ce que je dis, c'est qu'à priori, dans le cas particulier du pb que j'ai rencontré il n'est PAS corrélé avec un truc mal désalloué (le pb survient avant l'appel explicite à tout delete).

n°675047
gilou
Modérateur
Modosaurus Rex
Posté le 16-03-2004 à 14:09:18  profilanswer
 

De toute facon, tant que tu donneras aussi peu de contexte, c'est sur qu'on resoudra pas ton pb.
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°675049
frenchkiss
Posté le 16-03-2004 à 14:10:19  profilanswer
 

c sur..
d ou vient le 8
qu est ce que tu mets dans ton tab..
tu chausses du combien..

n°675065
leFab
Itadakimasu !!!
Posté le 16-03-2004 à 14:21:42  profilanswer
 

frenchkiss a écrit :

c sur..
d ou vient le 8
qu est ce que tu mets dans ton tab..
tu chausses du combien..
 


 
Le 8, c'est une variable qui vaut 8, peu importe d'où ça vient non ?
Le tab, ce que je mets dedans n'est pas important puisque le plantage survient avant que je mette quoi que ce soit dedans : il survient au moment de l'allocation.
 
gilou> je ne peux répondre à ta question, puisque l'erreur est désormais différente, même si elle arrive au même endroit : maintenant, l'allocation de ce tableau me renvoie un pointeur NULL. Alors que la mémoire est très loin d'être pleine.
Pour le contexte, quel genre d'info particulière veux tu (le code qu'il y a au dessus est assez long -> c'est un algo de calcul d'enveloppe convexe 3D si tu vois ce que c'est).

n°675076
frenchkiss
Posté le 16-03-2004 à 14:33:26  profilanswer
 

>Le 8, c'est une variable qui vaut 8, peu importe d'où ça vient non ?  
 
ben si ca importe , si c est lie a la facon don tu le remplis..
 
>Le tab, ce que je mets dedans n'est pas important puisque le >plantage survient avant que je mette quoi que ce soit dedans : >il survient au moment de l'allocation.  
 
bon ben si tu veux rien lacher d'aute que  
mon new int[8] crache  , dites moi poukoi
 
j ai pas envie de jouer au cmilblik moi
FK

n°675090
leFab
Itadakimasu !!!
Posté le 16-03-2004 à 14:44:51  profilanswer
 

frenchkiss a écrit :

>Le 8, c'est une variable qui vaut 8, peu importe d'où ça vient non ?  
 
ben si ca importe , si c est lie a la facon don tu le remplis..


 
? Je ne comprends pas vraiment ta phrase mais qd je dis que ça n'importe pas, c'est que même si je remplace mon "new int[toto]" par new int[8] écrit en dur, le même problème survient. Je te rappelles aussi que le pb survient avant que je commence à remplir le tableau.
 

Citation :

bon ben si tu veux rien lacher d'aute que  
mon new int[8] crache  , dites moi poukoi
 
j ai pas envie de jouer au cmilblik moi
FK


 
Mais je ne demande pas de me dire exactement pourquoi (pour ça il faudrait carrément que je poste l'intégralité du code et c'est un peu trop énorme), la question du topic est simplement : quelles sont les causes connues qui peuvent faire crasher un new dans le cas général. Et quels sont les éventuels remèdes. [:spamafote]

n°675104
Kristoph
Posté le 16-03-2004 à 14:56:40  profilanswer
 

Toutes les cause que l'on a donné correspondent à un bug qui se déclenche avant le new. Peu importe donc comment tu fais celui-ci car le problème ne viens pas de là.
 
Si tu es sous Linux, essaye Valgrind. Sinon, achète Purify ou un outil equivalent :)


Message édité par Kristoph le 16-03-2004 à 14:57:01
n°675109
leFab
Itadakimasu !!!
Posté le 16-03-2004 à 15:01:46  profilanswer
 

Kristoph a écrit :

Toutes les cause que l'on a donné correspondent à un bug qui se déclenche avant le new. Peu importe donc comment tu fais celui-ci car le problème ne viens pas de là.
 
Si tu es sous Linux, essaye Valgrind. Sinon, achète Purify ou un outil equivalent :)


 
Merci, je suis sous Windows, y a t'il des outils équivalents mais gratuits (on peut rêver on sait jamais).

n°675171
Combi_A_Ve​ndre
Posté le 16-03-2004 à 16:24:39  profilanswer
 

tu développes avec quel environnement ? Visual ?


---------------
The best way to accelerate a computer running windows is at 9.8m.s-2
n°675176
leFab
Itadakimasu !!!
Posté le 16-03-2004 à 16:30:03  profilanswer
 

Combi_A_Vendre a écrit :

tu développes avec quel environnement ? Visual ?  


 
Oui, Visual C++ 6.
 
EDIT : correction du quote


Message édité par leFab le 16-03-2004 à 16:46:26
n°675186
cricri_
Posté le 16-03-2004 à 16:43:47  profilanswer
 

:o  Depuis quand VC6 est gratos ??

n°675376
gilou
Modérateur
Modosaurus Rex
Posté le 16-03-2004 à 20:48:45  profilanswer
 

leFab a écrit :


 
Oui, Visual C++ 6.
 
EDIT : correction du quote


Si tu met un breakpoint a la ligne ou ca merde , la pile d'appel est elle correcte avant d'executer le new (et apres??)
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°675390
leFab
Itadakimasu !!!
Posté le 16-03-2004 à 21:25:29  profilanswer
 

gilou a écrit :


Si tu met un breakpoint a la ligne ou ca merde , la pile d'appel est elle correcte avant d'executer le new (et apres??)
A+,


 
Merci tout le monde, j'ai pu identifier le pb. Effectivement, un peu avant dans mon code, j'écris à l'extérieur du tableau.
 
Pour info, ça parlera sans doute à ceux qui font un peu de 3D : contrairement à ce que je pensais, le nombre de triangles de l'enveloppe convexe d'un mesh initialement concave peut être plus grand que le nombre de triangles du mesh initial.
 
J'avais donc initialisé mon tableau de triangles avec le nombre de triangles du mesh de base (concave). Et PAF.

n°675774
HelloWorld
Salut tout le monde!
Posté le 17-03-2004 à 03:34:22  profilanswer
 

Ca n'aurait peut être rien changé à ton cas, mais c'est ce genre de chose qui m'a poussé à utiliser std::vector ainsi modifié :

Code :
  1. reference operator[](size_type _Pos)
  2.  {
  3. #ifdef _DEBUG
  4.  return at(_Pos);
  5. #else
  6.  return (*(begin() + _Pos));
  7. #endif
  8.  }


at vérifie les limites, contrairement à []


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°675815
Kristoph
Posté le 17-03-2004 à 09:02:41  profilanswer
 

HelloWorld a écrit :

Ca n'aurait peut être rien changé à ton cas, mais c'est ce genre de chose qui m'a poussé à utiliser std::vector ainsi modifié :

Code :
  1. reference operator[](size_type _Pos)
  2.  {
  3. #ifdef _DEBUG
  4.  return at(_Pos);
  5. #else
  6.  return (*(begin() + _Pos));
  7. #endif
  8.  }


at vérifie les limites, contrairement à []


 
Ou alors tu utilises simplement STLPort en mode Debug car celle-ci ajoute elle même les verifications de ce genre. Et beaucoup plus de verifications de ce genre même.

n°676465
HelloWorld
Salut tout le monde!
Posté le 17-03-2004 à 18:52:30  profilanswer
 

kewl.
Je me suis tjrs demandé pkoi c'était pas fait (MS + SGI).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Qu'est ce qui peut faire planter un new ?

 

Sujets relatifs
[python - nioube inside] boucle infinie qui fait planter mon GUI[HTML] Balise qui fait planter Internet Explorer
MySQL, jointure qui fait planter MySQL .... [RESOLU][flash+php] je fais planter IE avec mon menu...
Un module qui fait tout planter !!!Qu'est-ce qui peut faire planter un script PHP
[C] comment éviter de planter lamentablement...Epitech : Quelques conseils pour ne pas se planter :)
Plus de sujets relatifs à : Qu'est ce qui peut faire planter un new ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)