Probleme au niveau des classes...

Probleme au niveau des classes... - C++ - Programmation

Marsh Posté le 24-03-2004 à 16:15:50    

Parfoit lorsque je crée des fonctions dans mes classes jarrive avec des problemes de logique qui pourait me couter des problèmes de perte de mémoire, comme par exemple :
 
 
Dans cette fonction je veux faire un traitement avec absolument une variable dynamique non-membre et, la fonction return 0 si il y a eu un echec..
il y a des variable membre dans la classe que j'utilise dans la fonction qui sont des entier suposon... int m_Var2, m_Var3, m_Var4;
 

Code :
  1. bool ClasseBidon::FonctionBidon()
  2. {
  3. BYTE* DynVar1;
  4. //je lui donne une grosseure pour faire le traitement...
  5. DynVar1 = new BYTE[1000000];
  6. // dans le traitement j'utilise des fonction qui me return 0 s'il y a eu des erreur...
  7. m_Var2 = Fct(DynVar1);
  8. if(!m_Var2) return 0; // Echec!
  9. //je continue le traitement...
  10. m_Var3 = Fct2(DynVar1);
  11. if(!m_Var3) return 0; // Echec!
  12. m_Var4 = m_Var2 + m_Var3; // Aucun rapport... :)
  13. // Ensuite jai fini mon traitement je ferme ma variable dynamique...
  14.     delete[] DynVar1;
  15. return 1; // Succes!
  16. }


 
bon maintenant vous pouvez peut-être surment comprendre mon problème... si par exemple la fonction Fct2() retourne une erreur  
et bien je termine automatiquement ma fonction mais le problème est que ma variable dynamique est encore ouverte...
 
Comment dois-je procédé pour regler ce probleme...
 
mettre sa?
if(!)
{
 delete[] DynVar1;
 return 0;
}
pour chaque fonction qui me retourne 0 s'il y a une erreur?... je crois pas que sa marche puisque dans la réalité des fois  
j'ai beaucoup de fonction a prendre pour faire mon traitement et sa serai de la répétition de code... en-tk je peut  
me tromper mais comment je fait ou comment procédé vous dans ce jenre de cas?  

Reply

Marsh Posté le 24-03-2004 à 16:15:50   

Reply

Marsh Posté le 24-03-2004 à 16:37:59    

1) soit tu mets un delete à chaque point de sorti
2) tu utilises std::vector<BYTE> et hop son constructeur alloue comme il faut et son destructeur fait le ménage quand tu sors de ta fonction : c'est simple, t'as plus rien à faire

Reply

Marsh Posté le 24-03-2004 à 17:33:33    

dans le fond tu me dit dutiliser une classe pour avoir son destructeur hmmm.. pas bête comme idée
je vais assayer sa

Reply

Marsh Posté le 24-03-2004 à 17:34:41    

non : je te dis juste qu'en C++ sécurisé, toutes les allocations mémoires sont encapsulées pour éviter les fuites (et notemment quand un exception est levée)

Reply

Marsh Posté le 25-03-2004 à 11:45:15    

Code :
  1. bool ClasseBidon::FonctionBidon()
  2. {
  3. BYTE* DynVar1;
  4. //je lui donne une grosseure pour faire le traitement...
  5. DynVar1 = new BYTE[1000000];
  6. // dans le traitement j'utilise des fonction qui me return 0 s'il y a eu des erreur...
  7. m_Var2 = Fct(DynVar1);
  8. if(!m_Var2) return 0; // Echec!
  9. //je continue le traitement...
  10. m_Var3 = Fct2(DynVar1);
  11. if(!m_Var3) return 0; // Echec!
  12. m_Var4 = m_Var2 + m_Var3; // Aucun rapport... :)
  13. // Ensuite jai fini mon traitement je ferme ma variable dynamique...
  14.     delete[] DynVar1;
  15. return 1; // Succes!
  16. }


 
 

Code :
  1. bool ClasseBidon::FonctionBidon()
  2. {
  3.         bool bRet = false;
  4. BYTE* DynVar1 = new BYTE[1000000];
  5. m_Var2 = Fct(DynVar1);
  6. if(m_Var2)
  7. {
  8.  m_Var3 = Fct2(DynVar1);
  9.  if(m_Var3)
  10.  {
  11.   m_Var4 = m_Var2 + m_Var3; // Aucun rapport... :)
  12.   bRet = true;
  13.  }
  14. }
  15. delete[] DynVar1;
  16. return bRet;
  17. }


 
C'est quand meme mieux comme ca non ???


Message édité par snipix le 25-03-2004 à 11:46:57
Reply

Marsh Posté le 25-03-2004 à 12:06:01    

non. pourquoi tu ne fais pas ce que je te dit
 
 

Code :
  1. bool ClasseBidon::FonctionBidon()
  2.   {
  3.      std::vector<BYTE> DynVar1(1000000);
  4.    
  5.      // dans le traitement j'utilise des fonction qui me return 0 s'il y a eu des erreur...
  6.      m_Var2 = Fct(&DynVar1[0]);
  7.      if(!m_Var2) return false;
  8.        
  9.      //je continue le traitement...
  10.      m_Var3 = Fct2(&DynVar1[0]);
  11.      if(!m_Var3) return false; // Echec!
  12.      
  13.      m_Var4 = m_Var2 + m_Var3; // Aucun rapport... :)
  14.    
  15.      // Ensuite jai fini mon traitement je ferme ma variable dynamique...
  16.  
  17.      return true; // Succes!
  18.   }


 
le truc c'est qu'un vecteur est alloué de manière contigu. donc sous réserve que tu ne redimensionnes pas ton vecteur &v[0] te donne un pointeur comme si tu manipulé un tableau classique.

Reply

Marsh Posté le 25-03-2004 à 12:17:35    

pourquoi si peu de monde utilise la STL :o
C'est quand meme 'achement utile :D

Reply

Sujets relatifs:

Leave a Replay

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