violation d'acces avec fclose et delete

violation d'acces avec fclose et delete - C++ - Programmation

Marsh Posté le 22-03-2005 à 15:07:30    

Bonjour a tous,
 
je travaille sous C++ builder 5.2, lorsque je compile mon code tout se passe bien, mais lorsque je le lance j'ai des violations d'acces et je ne comprend pas à quoi ça correspond comme problème: si mon code n'est pas bon ou si j'ai un problème de mémoire ou autre...
je vous met la partie du code qui me fait les violations d'accés, j'ai marqué en commentaire où elles se manifestent le plus souvent, mais c'est aléatoire :

Code :
  1. void MaClasse::MaFonction ()
  2. {
  3.  TWindow     *Window = NULL;
  4. TWindow     *WindowTest = NULL;
  5. char far * str = NULL;
  6. int maxCount, maxCountTest, verif;
  7. char filename[20];
  8. char recherche [40];
  9. int flag;
  10. FILE *fp = NULL;
  11. str = new char far;
  12. fp = new FILE;
  13. Window = new TWindow(this);
  14. WindowTest = new TWindow(this);
  15. flag = 0;
  16. //recherche du type de fichier
  17. WindowTest = GetWindowPtr(GetActiveWindow());
  18. maxCountTest = WindowTest->GetWindowTextLength();
  19. WindowTest->GetWindowText(str,maxCountTest);
  20. strcpy(recherche, str);
  21. delete WindowTest; // violation d'acces ici
  22. for (int i=0; i<40; i++)
  23. {
  24.  if (recherche[i]=='[')
  25.  {
  26.   if(recherche[i+1]=='L')
  27.   {
  28.    flag = 0;
  29.    break;
  30.   }
  31.   else if (recherche[i+1]=='C')
  32.   {
  33.    flag = 1;
  34.    break;
  35.   }
  36.   else
  37.   {
  38.    flag = 2;
  39.    break;
  40.   }
  41.  }
  42. }
  43. //traitement
  44. if (flag == 1)
  45. {
  46.  Window = GetActiveMDIChild()->GetClientWindow();
  47.  maxCount = Window->GetWindowTextLength();
  48.  strcpy(filename,"C:\\test\\test.txt" );
  49.  if ((fp = fopen(filename, "w+" )) == NULL)
  50.  {
  51.   fprintf(stderr, "Erreur à l'ouverture du fichier %s en mode w+.\n\n", filename);
  52.   exit(1);
  53.  }
  54.  verif = (Window->GetWindowText(str,maxCount));
  55.  if(verif!=0)
  56.  {
  57.   fprintf(fp, "%s", str);
  58.  }
  59.  else
  60.  {
  61.   fprintf(fp, "il n'y a pas de texte" );
  62.  }
  63.  fclose(fp);//violation d'acces ici
  64.  delete fp;//violation d'acces a tous les "delete"
  65.  delete str;
  66.  delete Window;
  67. }
  68. else
  69. {
  70. suite.....
  71. }
  72. }


 
Quelqu'un a t'il le courage de me donner un coup de main?? ;)
 
Merci


Message édité par barucca le 22-03-2005 à 18:48:51
Reply

Marsh Posté le 22-03-2005 à 15:07:30   

Reply

Marsh Posté le 24-03-2005 à 20:27:13    

1. Pour accéder à un fichier tu n'as pas à allouer un FILE, ni à le delete après. D'autant plus que FILE c'est du C et pas du C++, tout comme tes fprintf, etc...;
2. Pourquoi allouer WindowTest pour après le remplacer par un pointeur vers la fenêtre active et surtout essayer de supprimer cette fenêtre ?
 
Tu fais des new et des delete qui n'ont absolument rien à faire là ! Je ne saurais que trop te recommander de prendre le temps de lire un cours de C++ au plus vite.

Reply

Marsh Posté le 24-03-2005 à 20:54:47    

pourquoi tu fais un delete ?
 
pourquoi tu utilises les FILE* ? c'est du C !
pourquoi tu utilises les char* ? c'est du C !
 
et en plus comme t'y comprends rien, ben ton programme fait n'importe quoi !

Reply

Marsh Posté le 24-03-2005 à 20:55:07    

#include <fstream>
#include <string>
 
using namespace std;

Reply

Marsh Posté le 24-03-2005 à 22:02:50    

Barucca, soit tu utilises les fstream, soit à la rigueur tu te crées une classe fichier dans laquelle tu fais un fclose dans le destructeur (en prenant soin de pas lever d'exception).

Reply

Marsh Posté le 29-03-2005 à 15:14:19    

merci à ceux qui ont répondu gentiment.  
J'ai fini par trouver où été l'erreur principale, j'avais plusieurs erreurs, bien sur, dont des tableau avec de mauvaises tailles donc j'empiété sur le parametre suivant dans la pile. Bien qu'étant du C les FILE etc... peuvent fonctionner en C++.

Reply

Marsh Posté le 29-03-2005 à 15:47:25    

ça peut, mais c'est dégeux, contraire à l'esprit du C++ et terriblement casse gueule.

Reply

Sujets relatifs:

Leave a Replay

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