Du C au C++ avec STL: probleme resolu mais non compris

Du C au C++ avec STL: probleme resolu mais non compris - C++ - Programmation

Marsh Posté le 30-01-2003 à 16:55:09    

Salut a tous,
 
Voila le probleme (sous Visual Studio 6, SP5, utilisation de STLport au lieu de l'implementation STL de Microsoft qui est pourrie  :kaola: ):
J'ai une fonction C++, qui a comme parametre une reference sur un object string. J'affecte a ce string un buffer temporaire char* alloue avec un new, puis je detruit ce buffer (ne pas me demander pourquoi une telle manipe horrible, je suis malheureusement oblige dans ce cas la).
Tout semble marcher, mais quand j'arrive dans le destructeur du string, j'ai un plantage (memoire corrompue)  :heink: .
Si je remplace l'affectation du string (operateur =), par l'operateur +=, tout rentre dans l'ordre, plus de plantage  :pt1cable:  
 
Voici un extrait du bout de code:
 

Code :
  1. void CMyClass::MyFunction(string& strLine)
  2. {
  3.     blablablabla
  4.     ...
  5.     PSTR pTmpLine = new CHAR[nLineSize+1];
  6.     strncpy(pTmpLine,m_pMapData,nLineSize);
  7.     *(pTmpLine+nLineSize) = '\0';
  8. #if _CA_MARCHE_
  9.     strLine = "";  // Code qui fonctionne
  10.     strLine += pTmpLine;
  11. #else
  12.     strLine = pTmpLine; // Code qui cause le plantage
  13. #endif
  14.     delete [] pTmpLine;
  15. }
  16. int main()
  17. {
  18.    CMyClass  myObject;
  19.    string    strBuffer;
  20.    myObject.MyFunction(strBuffer);
  21.    return 0;
  22. } // Quand il y a plantage, c'est ici (appel du destructeur de strBuffer)


 
Est ce qu'un guru en STL pourrait m'aider?  :D  
 
Merci d'avance!!!  :jap:


Message édité par YungMakko le 30-01-2003 à 16:56:10

---------------
In tartiflette, we trust!
Reply

Marsh Posté le 30-01-2003 à 16:55:09   

Reply

Marsh Posté le 30-01-2003 à 17:06:10    

c'est quoi les CHAR, PSTR? les string sont seulement compatibles avec les char et les char*. que dit ton débugger pour le plantage? (m'est d'avis que ca devrait meme pas compiler)
 
moi tout fonctionne bien. mettre le '\0' apres strncpy ne sert a rien.

Reply

Marsh Posté le 30-01-2003 à 17:14:47    

++Taz a écrit :

c'est quoi les CHAR, PSTR? les string sont seulement compatibles avec les char et les char*. que dit ton débugger pour le plantage? (m'est d'avis que ca devrait meme pas compiler)
 
moi tout fonctionne bien. mettre le '\0' apres strncpy ne sert a rien.


 
Ah oui pardon, c'est juste des typedefs.  :D  
 
typedef PSTR   char*;
typedef CHAR   char;
 
Le message d'erreur concerne le CRT , et indique un block dans le heap qui est corrompu.


Message édité par YungMakko le 30-01-2003 à 17:15:37

---------------
In tartiflette, we trust!
Reply

Marsh Posté le 30-01-2003 à 17:26:54    

:heink: ca vient de ton compilo ou alros t'es parti dans le decor quelque part.
 
tu peux essayer  
 
strLine=string(pstrLine);  
c'est à dire expliciter le constructeur

Reply

Marsh Posté le 30-01-2003 à 17:33:17    

++Taz a écrit :

:heink: ca vient de ton compilo ou alros t'es parti dans le decor quelque part.
 
tu peux essayer  
 
strLine=string(pstrLine);  
c'est à dire expliciter le constructeur


 
Merci; mais meme erreur. Bon, ca me rassure, c'est bien le compilo ou alors l'implementation STL qui deconne: j'obterai volontier pour le compilateur, vu que STLport est repute pour sa robustesse et que Visual 6 gere tres mal les templates.


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 30-01-2003 à 17:38:44    

et t'as zeros warnings à la compilation?

Reply

Marsh Posté le 30-01-2003 à 17:45:18    

++Taz a écrit :

et t'as zeros warnings à la compilation?


 
Ouaip, aucun warning (niveau par default: Level 3).
Avec les STL fournit avec Visual j'avais encore bien plus de problemes que cela. C'etait du delire, c'est pour ca que je suis passe a STLport, ca a resolu d'un coup plein de bugs. Sauf ce nouveau qui est apparu. Mais dans l'ensemble, ca va quand meme bien mieux qu'avant.


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 30-01-2003 à 17:53:44    

tu peux aussi essayer celle de SGI.
mais la je vois pas ou est le problème si ce n'est au niveau du compilateur

Reply

Marsh Posté le 30-01-2003 à 18:04:39    

++Taz a écrit :

tu peux aussi essayer celle de SGI.
mais la je vois pas ou est le problème si ce n'est au niveau du compilateur


 
Merci bcp quand meme!  STLport se base justement sur l'implementation de SGI. Je doute doncm que ca change grand chose. Mais ce n'est pas grave, ca marche comme ca. Je vais voir mon code sous UNIX, la ca devrait fonctionner dans les 2 cas.


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 30-01-2003 à 18:06:39    

moi ca marche aussi avec gcc sous windows (mingw)

Reply

Marsh Posté le 30-01-2003 à 18:06:39   

Reply

Marsh Posté le 30-01-2003 à 18:08:47    

[fixed][/fixed]Sous VisualC++ 6.0 (pas de ServicePack) avec l'implementation STL de Microsoft, j'ai essayé ça :

Code :
  1. #include <string>
  2. static char m_pMapData[] = "cool!";
  3. int main(int argc, char* argv[])
  4. {
  5. std::string strLine;
  6. char *pTmpLine = new char[strlen(m_pMapData) + 1];
  7. strncpy( pTmpLine, m_pMapData, strlen(m_pMapData) + 1 ); // '+1' pour que strncpy me rajoute le '\0'
  8. strLine= pTmpLine;
  9. delete[] pTmpLine;
  10. return 0;
  11. }


 
J'ai fait un truc qui ressemble beaucoup à ton programme et (bien évidemment) ça marche. Il semble donc que ce ne soit pas un problème du compilo...
 
Le mieux est encore de regarder en mode pas à pas ce qui se passe en mémoire (et notamment dans strLine). Peut être surveiller aussi ce que tu as dans pMapData ?


---------------
each day I don't die is cheating
Reply

Marsh Posté le 30-01-2003 à 18:31:08    

Bon, dur dur.  
m_pMapData est un pointeur sur un fichier mappe en memoire.
ca ne devrait rien changer de toute facon.
Je cherche, il doit en effet y avoir un bug ailleurs dans mon code, mais c'est bizard qu'avec l'operateur +=, le probleme ne se pose pas aussi.
Je cherche...  
 


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 30-01-2003 à 18:34:37    

gatorette a écrit :

[fixed][/fixed]Sous VisualC++ 6.0 (pas de ServicePack) avec l'implementation STL de Microsoft, j'ai essayé ça :
[cpp
strncpy( pTmpLine, m_pMapData, strlen(m_pMapData) + 1 ); // '+1' pour que strncpy me rajoute le '\0'
 
}[/cpp]
 


 
Je n'ai pas mis de +1, car m_pMapData est un fichier mappe, est pas une chaine de charactere. Donc il n'y a pas de '\0' en fin de la chaine desiree.


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 31-01-2003 à 00:27:06    

Et en pas à pas, ça donne quoi ? Tout semble bien ?


---------------
each day I don't die is cheating
Reply

Marsh Posté le 31-01-2003 à 04:16:58    

Et avec ça ?

Code :
  1. strLine = string(pstrLine, strlen(pstrLine));


Message édité par Musaran le 01-02-2003 à 06:08:27

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 31-01-2003 à 09:01:15    

Dans le même genre, si quelqu'un pouvait me dire pourquoi ce code compile alors qu'il ne fonctionne pas :

Code :
  1. #include <iostream>
  2. #include <string>
  3. int main( void )
  4. {
  5.         std::string s;
  6.         s = 1;
  7.         std::cout << s << std::endl;
  8.         return 0;
  9. }


teste sur Linux RedHat 7.3, gcc 3.2


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 31-01-2003 à 10:35:37    

Ca veux dire quoi qu'il ne fonctionne pas ? core dump ? Affiche rien ?
 
D'après ce que je sais de "string", je prédis qu'il ne se passe rien ou presque car "s = 1" correspond à operator =(char c) qui va créer une chaine de longueur 1 ne contenant que le caractère c. Et donc, tu te retrouves avec cette chaine : "\1". Bien sur, \1 n'est pas affichable :)

Reply

Marsh Posté le 31-01-2003 à 12:56:02    

Yep, sous entendu que "la conversion de 2 en "2" ne fonctionne pas"
Il affiche un car a la con.
C'est bizarre ... je lui file un int, il utilise l'operateur =(char) sans me fouttre un avertissement ... pourtant la conversion int => char donne lieu a un warning normalement nan ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 31-01-2003 à 14:02:24    

Ca doit etre parceque 1 n'est pas un int mais représente le chiffre 1. Si tu avais int a = 1; s = a; peut-etre alors aurait eu un warning.

Reply

Marsh Posté le 31-01-2003 à 14:44:33    

J'ai testé :

Code :
  1. #include <iostream>
  2. #include <string>
  3. int main( void )
  4. {
  5.     std::string s;
  6.     int n = 1;
  7.     s = 1L;
  8.     s = int(1);
  9.     s = n;
  10.     s = n;
  11.     std::cout << s << std::endl;
  12.     return 0;
  13. }
  14. g++ -Wall -o teststr teststr.cpp


 
0 erreur, 0 warning ... :??:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 31-01-2003 à 15:19:56    

C'est dommage n'est ce pas :)
 
Mais bon, si tu veux convertir un entier en chaine de caractères, il y a d'autres moyens pour ça :  
 
Edit : c'est deprecié, utilise sstream à la place.


Message édité par Kristoph le 31-01-2003 à 15:23:57
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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