[résolut]problème avec char** new[] et delete[]

et delete[] [résolut]problème avec char** new[] - C++ - Programmation

Marsh Posté le 24-02-2014 à 20:51:54    

Bonjour,
 
après de longues séries de test j'ai un problème avec mon code de splitter au niveau des deletes
 

Code :
  1. Splitter::Splitter(const char* stringToSplit, const char splitChar)
  2. {
  3.         /*************************
  4.               du code inutile
  5.         *************************/
  6.         phrase = new char*[wordNb];
  7.         lettre = (char*)stringToSplit;
  8.         while(*lettre != '\n')
  9.         {
  10.         /*************************
  11.               du code inutile
  12.         *************************/
  13.                 mot = new char[length+1];
  14.         /*************************
  15.               du code inutile
  16.         *************************/
  17.         }
  18.         if(length != 0)
  19.         {
  20.             mot = new char[length+1];
  21.         /*************************
  22.               du code inutile
  23.         *************************/
  24.         }
  25.     }
  26. }
  27. Splitter::~Splitter()
  28. {
  29.     for(int i = 0; i < wordNb;i++)
  30.     {
  31.         //cout << "delete " << (void*)phrase[i] << endl;
  32.         delete [] phrase[i];
  33.     }
  34.     //cout << "delete " << (void*)phrase << endl;
  35.     delete [] phrase;
  36. }


 
j'ai donc une structure mémoire tel que:
 
phrase --------- mot
              |----- mot
              |----- mot
 
et tout a été alloué dynamiquement pour être accessible de l’extérieur.
parfois et je dit bien parfois sur le même fichier test lorsque je Split ligne par ligne j'obtient une erreur du style:

Spoiler :


*** Error in `/home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme': free(): invalid next size (fast): 0x0000000001470850 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x80996)[0x7fbd3ddd0996]
/home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme[0x4088bc]
/home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme[0x405555]
/home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme[0x405314]
/home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme[0x40681d]
/home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme[0x405153]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fbd3dd71de5]
/home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme[0x402389]
======= Memory map: ========
00400000-0040d000 r-xp 00000000 08:06 2885896                            /home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme
0060c000-0060d000 r--p 0000c000 08:06 2885896                            /home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme
0060d000-0060e000 rw-p 0000d000 08:06 2885896                            /home/morgan/Bureau/game dev/Polyphème/bin/Debug/Polypheme
013a0000-017c3000 rw-p 00000000 00:00 0                                  [heap]
41838000-418d5000 rw-p 00000000 00:00 0  
419be000-419c0000 r-xs 00000000 08:06 1311858                            /tmp/gl03OqxZ (deleted)
7fbd390d2000-7fbd392d2000 rw-s 1d9727000 00:05 13731                     /dev/nvidia0
7fbd392d2000-7fbd393d3000 rw-p 00000000 00:00 0  
7fbd393d3000-7fbd3940c000 r-xp 00000000 08:06 1848645                    /usr/local/lib/libjpeg.so.8.4.0
7fbd3940c000-7fbd3960c000 ---p 00039000 08:06 1848645                    /usr/local/lib/libjpeg.so.8.4.0
7fbd3960c000-7fbd3960d000 r--p 00039000 08:06 1848645                    /usr/local/lib/libjpeg.so.8.4.0
7fbd3960d000-7fbd3960e000 rw-p 0003a000 08:06 1848645                    /usr/local/lib/libjpeg.so.8.4.0
7fbd3960e000-7fbd39613000 r-xp 00000000 08:06 1709119                    /usr/lib/x86_64-linux-gnu/libXfixes.so.3.1.0
7fbd39613000-7fbd39812000 ---p 00005000 08:06 1709119                    /usr/lib/x86_64-linux-gnu/libXfixes.so.3.1.0
7fbd39812000-7fbd39813000 r--p 00004000 08:06 1709119                    /usr/lib/x86_64-linux-gnu/libXfixes.so.3.1.0
7fbd39813000-7fbd39814000 rw-p 00005000 08:06 1709119                    /usr/lib/x86_64-linux-gnu/libXfixes.so.3.1.0
7fbd39814000-7fbd3981d000 r-xp 00000000 08:06 1711740                    /usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0
7fbd3981d000-7fbd39a1c000 ---p 00009000 08:06 1711740                    /usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0
7fbd39a1c000-7fbd39a1d000 r--p 00008000 08:06 1711740                    /usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0
7fbd39a1d000-7fbd39a1e000 rw-p 00009000 08:06 1711740                    /usr/lib/x86_64-linux-gnu/libXrender.so.1.3.0
7fbd39a1e000-7fbd39a27000 r-xp 00000000 08:06 1705030                    /usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2
7fbd39a27000-7fbd39c26000 ---p 00009000 08:06 1705030                    /usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2
7fbd39c26000-7fbd39c27000 r--p 00008000 08:06 1705030                    /usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2
7fbd39c27000-7fbd39c28000 rw-p 00009000 08:06 1705030                    /usr/lib/x86_64-linux-gnu/libXcursor.so.1.0.2
7fbd39c28000-7fbd39e28000 rw-s 1e0f9a000 00:05 13731                     /dev/nvidia0
7fbd39e28000-7fbd3a028000 rw-s 1d2166000 00:05 13731                     /dev/nvidia0
7fbd3a028000-7fbd3a228000 rw-s 1d2111000 00:05 13731                     /dev/nvidia0
7fbd3a228000-7fbd3a328000 rw-s 1a0188000 00:05 13731                     /dev/nvidia0
7fbd3a328000-7fbd3a348000 rw-s e80a0000 00:05 13731                      /dev/nvidia0
7fbd3a348000-7fbd3a388000 rw-s 1dc51d000 00:05 13731                     /dev/nvidia0
7fbd3a388000-7fbd3a3a8000 rw-s 1e0d48000 00:05 13731                     /dev/nvidia0
7fbd3a3a8000-7fbd3a460000 rw-p 00000000 00:00 0  
7fbd3a460000-7fbd3a464000 r-xp 00000000 08:06 1705801                    /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1.0.0
7fbd3a464000-7fbd3a664000 ---p 00004000 08:06 1705801                    /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1.0.0
7fbd3a664000-7fbd3a665000 r--p 00004000 08:06 1705801                    /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1.0.0
7fbd3a665000-7fbd3a666000 rw-p 00005000 08:06 1705801                    /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1.0.0
7fbd3a666000-7fbd3a66b000 r-xp 00000000 08:06 1711747                    /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
7fbd3a66b000-7fbd3a86a000 ---p 00005000 08:06 1711747                    /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
7fbd3a86a000-7fbd3a86b000 r--p 00004000 08:06 1711747                    /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
7fbd3a86b000-7fbd3a86c000 rw-p 00005000 08:06 1711747                    /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
7fbd3a86c000-7fbd3a86e000 r-xp 00000000 08:06 1705078                    /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
7fbd3a86e000-7fbd3aa6e000 ---p 00002000 08:06 1705078                    /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
7fbd3aa6e000-7fbd3aa6f000 r--p 00002000 08:06 1705078                    /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
7fbd3aa6f000-7fbd3aa70000 rw-p 00003000 08:06 1705078                    /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
7fbd3aa70000-7fbd3aa8d000 r-xp 00000000 08:06 1704479                    /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
7fbd3aa8d000-7fbd3ac8c000 ---p 0001d000 08:06 1704479                    /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
7fbd3ac8c000-7fbd3ac8d000 r--p 0001c000 08:06 1704479                    /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
7fbd3ac8d000-7fbd3ac8e000 rw-p 0001d000 08:06 1704479                    /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0
7fbd3ac8e000-7fbd3ac9f000 r-xp 00000000 08:06 1705797                    /usr/lib/x86_64-linux-gnu/libXext.so.6.4.0
7fbd3ac9f000-7fbd3ae9e000 ---p 00011000 08:06 1705797                    /usr/lib/x86_64-linux-gnu/libXext.so.6.4.0
7fbd3ae9e000-7fbd3ae9f000 r--p 00010000 08:06 1705797                    /usr/lib/x86_64-linux-gnu/libXext.so.6.4.0
7fbd3ae9f000-7fbd3aea0000 rw-p 00011000 08:06 1705797                    /usr/lib/x86_64-linux-gnu/libXext.so.6.4.0
7fbd3aea0000-7fbd3afd0000 r-xp 00000000 08:06 1704902                    /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7fbd3afd0000-7fbd3b1d0000 ---p 00130000 08:06 1704902                    /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7fbd3b1d0000-7fbd3b1d1000 r--p 00130000 08:06 1704902                    /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7fbd3b1d1000-7fbd3b1d5000 rw-p 00131000 08:06 1704902                    /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7fbd3b1d5000-7fbd3cc1c000 r-xp 00000000 08:06 1721649                    /usr/lib/nvidia-319/libnvidia-glcore.so.319.32
7fbd3cc1c000-7fbd3ce1c000 ---p 01a47000 08:06 1721649                    /usr/lib/nvidia-319/libnvidia-glcore.so.319.32
7fbd3ce1c000-7fbd3d713000 rwxp 01a47000 08:06 1721649                    /usr/lib/nvidia-319/libnvidia-glcore.so.319.32
7fbd3d713000-7fbd3d72c000 rwxp 00000000 00:00 0  
7fbd3d72c000-7fbd3d72f000 r-xp 00000000 08:06 1721644                    /usr/lib/nvidia-319/tls/libnvidia-tls.so.319.32
7fbd3d72f000-7fbd3d92e000 ---p 00003000 08:06 1721644                    /usr/lib/nvidia-319/tls/libnvidia-tls.so.319.32
7fbd3d92e000-7fbd3d92f000 rw-p 00002000 08:06 1721644                    /usr/lib/nvidia-319/tls/libnvidia-tls.so.319.32
7fbd3d92f000-7fbd3d946000 r-xp 00000000 08:06 393545                     /lib/x86_64-linux-gnu/libpthread-2.17.so
7fbd3d946000-7fbd3db46000 ---p 00017000 08:06 393545                     /lib/x86_64-linux-gnu/libpthread-2.17.so
7fbd3db46000-7fbd3db47000 r--p 00017000 08:06 393545                     /lib/x86_64-linux-gnu/libpthread-2.17.so
7fbd3db47000-7fbd3db48000 rw-p 00018000 08:06 393545                     /lib/x86_64-linux-gnu/libpthread-2.17.so
7fbd3db48000-7fbd3db4c000 rw-p 00000000 00:00 0  
7fbd3db4c000-7fbd3db4f000 r-xp 00000000 08:06 393544                     /lib/x86_64-linux-gnu/libdl-2.17.so
7fbd3db4f000-7fbd3dd4e000 ---p 00003000 08:06 393544                     /lib/x86_64-linux-gnu/libdl-2.17.so
7fbd3dd4e000-7fbd3dd4f000 r--p 00002000 08:06 393544                     /lib/x86_64-linux-gnu/libdl-2.17.so
7fbd3dd4f000-7fbd3dd50000 rw-p 00003000 08:06 393544                     /lib/x86_64-linux-gnu/libdl-2.17.so
7fbd3dd50000-7fbd3df0d000 r-xp 00000000 08:06 393543                     /lib/x86_64-linux-gnu/libc-2.17.so
7fbd3df0d000-7fbd3e10d000 ---p 001bd000 08:06 393543                     /lib/x86_64-linux-gnu/libc-2.17.so
7fbd3e10d000-7fbd3e111000 r--p 001bd000 08:06 393543                     /lib/x86_64-linux-gnu/libc-2.17.so
7fbd3e111000-7fbd3e113000 rw-p 001c1000 08:06 393543                     /lib/x86_64-linux-gnu/libc-2.17.so
7fbd3e113000-7fbd3e118000 rw-p 00000000 00:00 0  
7fbd3e118000-7fbd3e12d000 r-xp 00000000 08:06 393393                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fbd3e12d000-7fbd3e32c000 ---p 00015000 08:06 393393                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fbd3e32c000-7fbd3e32d000 r--p 00014000 08:06 393393                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fbd3e32d000-7fbd3e32e000 rw-p 00015000 08:06 393393                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fbd3e32e000-7fbd3e431000 r-xp 00000000 08:06 393529                     /lib/x86_64-linux-gnu/libm-2.17.so
7fbd3e431000-7fbd3e630000 ---p 00103000 08:06 393529                     /lib/x86_64-linux-gnu/libm-2.17.so
7fbd3e630000-7fbd3e631000 r--p 00102000 08:06 393529                     /lib/x86_64-linux-gnu/libm-2.17.so
7fbd3e631000-7fbd3e632000 rw-p 00103000 08:06 393529                     /lib/x86_64-linux-gnu/libm-2.17.so
7fbd3e632000-7fbd3e718000 r-xp 00000000 08:06 1708218                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7fbd3e718000-7fbd3e917000 ---p 000e6000 08:06 1708218                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7fbd3e917000-7fbd3e91f000 r--p 000e5000 08:06 1708218                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7fbd3e91f000-7fbd3e921000 rw-p 000ed000 08:06 1708218                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7fbd3e921000-7fbd3e936000 rw-p 00000000 00:00 0  
7fbd3e936000-7fbd3e943000 r-xp 00000000 08:06 1850424                    /usr/local/lib/libSDL2_image-1.2.so.0.8.5
7fbd3e943000-7fbd3eb42000 ---p 0000d000 08:06 1850424                    /usr/local/lib/libSDL2_image-1.2.so.0.8.5
7fbd3eb42000-7fbd3eb43000 r--p 0000c000 08:06 1850424                    /usr/local/lib/libSDL2_image-1.2.so.0.8.5
7fbd3eb43000-7fbd3eb44000 rw-p 0000d000 08:06 1850424                    /usr/local/lib/libSDL2_image-1.2.so.0.8.5
7fbd3eb44000-7fbd3eb54000 rw-p 00000000 00:00 0  
7fbd3eb54000-7fbd3ec2e000 r-xp 00000000 08:06 1721648                    /usr/lib/nvidia-319/libGL.so.319.32
7fbd3ec2e000-7fbd3ee2d000 ---p 000da000 08:06 1721648                    /usr/lib/nvidia-319/libGL.so.319.32
7fbd3ee2d000-7fbd3ee6c000 rwxp 000d9000 08:06 1721648                    /usr/lib/nvidia-319/libGL.so.319.32
7fbd3ee6c000-7fbd3ee82000 rwxp 00000000 00:00 0  
7fbd3ee82000-7fbd3ef57000 r-xp 00000000 08:06 1836396                    /usr/local/lib/libSDL2-2.0.so.0.0.0
7fbd3ef57000-7fbd3f157000 ---p 000d5000 08:06 1836396                    /usr/local/lib/libSDL2-2.0.so.0.0.0
7fbd3f157000-7fbd3f15a000 r--p 000d5000 08:06 1836396                    /usr/local/lib/libSDL2-2.0.so.0.0.0
7fbd3f15a000-7fbd3f165000 rw-p 000d8000 08:06 1836396                    /usr/local/lib/libSDL2-2.0.so.0.0.0
7fbd3f165000-7fbd3f168000 rw-p 00000000 00:00 0  
7fbd3f168000-7fbd3f178000 r-xp 00000000 08:06 393532                     /lib/x86_64-linux-gnu/ld-2.17.so
7fbd3f178000-7fbd3f179000 r-xp 00010000 08:06 393532                     /lib/x86_64-linux-gnu/ld-2.17.so
7fbd3f179000-7fbd3f18b000 r-xp 00011000 08:06 393532                     /lib/x86_64-linux-gnu/ld-2.17.so
7fbd3f195000-7fbd3f197000 rw-p 00000000 00:00 0  
7fbd3f199000-7fbd3f1a0000 rw-s 1dc74b000 00:05 13731                     /dev/nvidia0
7fbd3f1a0000-7fbd3f1a4000 rw-s 1d23f8000 00:05 13731                     /dev/nvidia0
7fbd3f1a4000-7fbd3f1e4000 rw-s 1d95f8000 00:05 13731                     /dev/nvidia0
7fbd3f1e4000-7fbd3f204000 rw-s 1dc7f7000 00:05 13731                     /dev/nvidia0
7fbd3f2c2000-7fbd3f2c4000 rw-p 00000000 00:00 0  
7fbd3f2c4000-7fbd3f2c6000 rw-s 00000000 08:06 1311858                    /tmp/gl03OqxZ (deleted)
7fbd3f2c6000-7fbd3f2cd000 r--s 00000000 08:06 2109333                    /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7fbd3f2cd000-7fbd3f2e2000 rw-s 1fe44e000 00:05 13731                     /dev/nvidia0
7fbd3f2e2000-7fbd3f36c000 rw-p 00000000 00:00 0  
7fbd3f36c000-7fbd3f36d000 rw-s 19e08c000 00:05 13731                     /dev/nvidia0
7fbd3f36d000-7fbd3f36e000 rw-s efd60000 00:05 13731                      /dev/nvidia0
7fbd3f36e000-7fbd3f36f000 rw-s efd60000 00:05 13731                      /dev/nvidia0
7fbd3f36f000-7fbd3f370000 rw-s f6642000 00:05 13731                      /dev/nvidia0
7fbd3f370000-7fbd3f371000 rw-s 1f4802000 00:05 13731                     /dev/nvidia0
7fbd3f371000-7fbd3f372000 rw-s f6641000 00:05 13731                      /dev/nvidia0
7fbd3f372000-7fbd3f373000 rw-s 1fcd35000 00:05 13731                     /dev/nvidia0
7fbd3f373000-7fbd3f374000 rw-s 1bd849000 00:05 13731                     /dev/nvidia0
7fbd3f374000-7fbd3f375000 rw-s f6060000 00:05 13731                      /dev/nvidia0
7fbd3f375000-7fbd3f38a000 rw-p 00000000 00:00 0  
7fbd3f38a000-7fbd3f38b000 r--p 00022000 08:06 393532                     /lib/x86_64-linux-gnu/ld-2.17.so
7fbd3f38b000-7fbd3f38d000 rw-p 00023000 08:06 393532                     /lib/x86_64-linux-gnu/ld-2.17


 
où ici  0x0000000001470850 est bien l'adresse que l'on essai de delete et qui a bien été crée avant
 
si vous avez des idées?
 
Merci d'avance,
Liffaen


Message édité par liffaen le 25-02-2014 à 19:24:42
Reply

Marsh Posté le 24-02-2014 à 20:51:54   

Reply

Marsh Posté le 24-02-2014 à 21:11:51    

Bonsoir !
 
Avez-vous bien alloué tous les éléments du tableau phrase ? Cela n'apparaît pas dans votre code.
 
Si vous voulez corriger votre code, utilisez valgrind pour vous aider à trouver la source de l'erreur mémoire.
 
Sinon, vous pouvez aussi utiliser un std::vector < std::string> et vous n'avez plus à vous soucier des pointeurs :)
 
Voire des pointeurs évolués de la STL, mais je reconnais que c'est moins formateur.
 
Bonne continuation !

Reply

Marsh Posté le 24-02-2014 à 21:28:06    

effectivement il me manque la ligne:
 
phrase[wordNb]=mot;
 
après les déclarations de mot
 
mon but est la formation effectivement, je vais voir valgrind, je ne connaissait pas.
Merci pour nom

Reply

Marsh Posté le 24-02-2014 à 21:31:21    

voila ce que l'a répondu  valgrind:
 
--8126-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--8126-- si_code=1;  Faulting address: 0x13443168;  sp: 0x402b1ade0
 
valgrind: the 'impossible' happened:
   Killed by fatal signal
==8126==    at 0x38063BB6: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==8126==    by 0x3802B33C: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==8126==    by 0x3802B565: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==8126==    by 0x3809D58D: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==8126==    by 0x380AC14C: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
 
sched status:
  running_tid=1
 
Thread 1: status = VgTs_Runnable
==8126==    at 0x4C2AFE7: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8126==    by 0x4086AF: Splitter::Splitter(char const*, char) (Splitter.cpp:28)
==8126==    by 0x4054D0: Object::load(std::string) (Object.cpp:56)
==8126==    by 0x405313: Object::Object(std::string, std::string, std::string, std::string) (Object.cpp:29)
==8126==    by 0x40681C: Scene::bouclePrincipale() (Scene.cpp:181)
==8126==    by 0x405152: main (main.cpp:25)
 
 
ce qui est étrange c'est que parfois ca marche parfois non

Message cité 1 fois
Message édité par liffaen le 24-02-2014 à 21:32:50
Reply

Marsh Posté le 24-02-2014 à 23:22:29    

liffaen a écrit :

ce qui est étrange c'est que parfois ca marche parfois non


 
Bienvenue dans le monde des comportements non-définis (undefined behaviour), le pire qui puisse arriver c'est que ça fonctionne. Parce que ça te donne l'illusion que tout fonctionne, jusqu'au beau jour ou le programme va se planter comme un malpropre. Là tu as le mauvais programmeur, qui va blamer la machine de l'utilisateur et tu as le bon programmeur, qui va vérifier son code.
 
A vu de nez, ton problème sent très très fort l'écriture en dehors d'une zone mémoire allouée (buffer overflow). valgrind est sensé être assez compétent pour trouver l'origine de ce problème, mais apparemment tu as réussi l'exploit de faire planter valgrind  [:implosion du tibia].
 
À tout hasard et si ce n'est pas trop long, tu devrais poster les parties marquées comme "du code inutile".
 
Allez une petite anecdocte qui m'est arrivé il y a quelques mois: un client avait appellé le support parce qu'un logiciel que j'avais développé ne se lançait plus sur son poste. Quand on a regardé la date d'installation, la dernière mise à jour remontait à plus de 5 ans. La version en question contenait un buffer overflow à la con, corrigé quelques semaines après la version installée chez le client. Pendant 5 ans, ce logiciel a fonctionné sans le moindre problème, jusqu'à une mise à jour de Windows qui l'a fait planté systèmatiquement  :sweat:  

Reply

Marsh Posté le 25-02-2014 à 01:43:07    

Bien sur voila le code complet:
 

Code :
  1. #include "Splitter.h"
  2. Splitter::Splitter(const char* stringToSplit, const char splitChar): wordNb(0),currentWord(0)
  3. {
  4.     int length = 0;
  5.     bool newWord = true;
  6.     char* mot;
  7.     char* lettre = (char*)stringToSplit;
  8.     while(*lettre != '\n')
  9.     {
  10.         if(newWord && (*lettre != splitChar))
  11.         {
  12.             wordNb++;
  13.             newWord = false;
  14.         }
  15.         else if(*lettre == splitChar)
  16.         {
  17.             newWord = true;
  18.         }
  19.         lettre++;
  20.     }
  21.     if(wordNb > 0)
  22.     {
  23.         phrase = new char*[wordNb];
  24.         wordNb = 0;
  25.         lettre = (char*)stringToSplit;
  26.         while(*lettre != '\n')
  27.         {
  28.             if(*lettre == splitChar)
  29.             {
  30.                 if(length == 0)
  31.                 {
  32.                     lettre++;
  33.                     continue;
  34.                 }
  35.                 mot = new char[length+1];
  36.                 for(int i = length-1 ; i>=0;i--)
  37.                 {
  38.                     mot[i]=*(lettre-length+i);
  39.                 }
  40.                 mot[length]='\0';
  41.                 length = 0;
  42.                 phrase[wordNb]=mot;
  43.                 wordNb++;
  44.             }
  45.             else
  46.             {
  47.                 lettre++;
  48.                 length++;
  49.             }
  50.         }
  51.         if(length != 0)
  52.         {
  53.             mot = new char[length+1];
  54.             for(int i = length-1 ; i>=0;i--)
  55.             {
  56.                 mot[i]=*(lettre-length+i);
  57.             }
  58.             mot[length]='\0';
  59.             length = 0;
  60.             phrase[wordNb]=mot;
  61.             wordNb++;
  62.         }
  63.     }
  64. }
  65. Splitter::~Splitter()
  66. {
  67.     for(int i = 0; i < wordNb;i++)
  68.     {
  69.         delete (void*)phrase[i];
  70.     }
  71.     delete (void*)phrase;
  72. }
  73. char* Splitter::next()
  74. {
  75.     if(currentWord<wordNb)
  76.         return phrase[currentWord++];
  77.     else
  78.         return 0;
  79. }
  80. char* Splitter::operator[](int b)
  81. {
  82.     return phrase[b%wordNb];
  83. }

Reply

Marsh Posté le 25-02-2014 à 12:45:46    

Mais pourquoi faire du C déguisé sous des habits C++ alors que les librairies standard C++ font déjà cela gratuitement?
Si on veut un (ou plusieurs) délimiteurs qui scindent une chaîne en tokens, ça se fait au niveau des character facets.
Et les containers standard sont la pour qu'on les utilise.
 
 

Code :
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. #include <vector>
  5. #include <iterator>
  6. #include <locale>
  7. using namespace std;
  8. struct delim : ctype<char> {
  9.   delim(char c) : ctype<char>(get_table(c)) {}
  10.   static mask const* get_table(char c)
  11.   {
  12.     static mask rc[table_size];
  13.     rc[c]  = ctype_base::space;
  14.     rc['\n'] = ctype_base::space;
  15.     return &rc[0];
  16.   }
  17. };
  18. int main ()
  19. {
  20.     istringstream iss("hello#world!#etc and etc..." );
  21.     // changement de facette pour délimiter
  22.     iss.imbue(locale(iss.getloc(), new delim('#')));
  23.     // split en tokens
  24.     vector<string> tokens;
  25.     copy(istream_iterator<string>(iss),
  26.          istream_iterator<string>(),
  27.          back_inserter<vector<string> >(tokens));
  28.     // imprimons le contenu du vector
  29.     copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, "\n" ));      
  30.     return 0;
  31. }


donne en sortie:

hello
world!
etc and etc...


et en ajoutant
rc[' '] = ctype_base::space;
dans get_table
on a en sortie

hello
world!
etc
and
etc...


 
Et si de plus on veut profiter des facilités du C++ moderne (ie C++ 11) pour avoir plus de flexibilité dans la construction de la facette, avec une liste de caractères:

Code :
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. #include <vector>
  5. #include <list>
  6. #include <iterator>
  7. #include <locale>
  8. using namespace std;
  9. struct delimitation_facet : ctype<char> {
  10.     delimitation_facet(list<char> delims) : ctype<char>(get_table(delims)) {}
  11.   static mask const* get_table(list<char> delims)
  12.   {
  13.     static mask rc[table_size];
  14.     for (char &c : delims)
  15.         rc[c]  = ctype_base::space;
  16.     return &rc[0];
  17.   }
  18. };
  19. int main ()
  20. {
  21.     istringstream iss("hello#world!#etc and etc..." );
  22.     iss.imbue(locale(iss.getloc(), new delimitation_facet(list<char>{{ '#', ' ', '\n'}})));
  23.     vector<string> tokens{istream_iterator<string>{iss}, istream_iterator<string>{}};
  24.     copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, "\n" ));      
  25.     return 0;
  26. }


 
A+,


Message édité par gilou le 25-02-2014 à 14:34:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 25-02-2014 à 19:23:28    

bon solution trouvé,
en gros le pb c'est les cas limites c'est a dire:
- aucun mot ---> phrase non allouée --> ne pas détruire
- si la chaîne est finie sans le séparateur, le dernier
  mot est-il bien pris en compte ?
 
voila voila,
un grand merci a ceux qui m'ont aidé
 
Liffaen

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed