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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] new - exception

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] new - exception

n°374022
Phod
Glouloulou ?
Posté le 28-04-2003 à 11:18:34  profilanswer
 

Slt :)
 
Je voudrais tout simplement tester si mon new a pus obtenir ou non de la memoire.
 
Sur le net on me dis un peut partout que new genere l'exception bad_alloc...  
 
je veut bien, mais comment je l'utilise ?
 
 
j'ai essayé pas mal de truc dont celui ci (qui ne compile pas : variable `class bad_alloc {anon}' has initializer but incomplete type)
 


void main(void)
{
    while (1) // on alloue jusqu'a epuisement de la RAM
    {
        try
        {
            char *a = new char[10000];
        }
        catch (bad_alloc) // Si le new a echoue...
        {
            cout << "exception bad_alloc recue !" << endl;
            exit(0);
        }
   }
}


 
Thx :)


---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
mood
Publicité
Posté le 28-04-2003 à 11:18:34  profilanswer
 

n°374039
Taz
bisounours-codeur
Posté le 28-04-2003 à 11:25:14  profilanswer
 

il faut mettre un nom à ton exception!
 
 

Code :
  1. #include <iostream>
  2. #include <sstream>
  3. using namespace std;
  4. int main(int argc, char **argv)
  5. {
  6.   if(argc!=2)
  7.     {
  8.       return 1;
  9.     }
  10.   istringstream is(argv[1]);
  11.   size_t i;
  12.   is >> i;
  13.   char *ptr=0;
  14.   try
  15.     {
  16.       ptr=new char[i];
  17.     }
  18.   catch(bad_alloc ex)
  19.     {
  20.       cerr << ex.what() << '\n';
  21.       return 1;
  22.     }
  23.  
  24.   cout << "Allocation OK\n";
  25.   delete[] ptr;
  26. }

 
 
 

[benoit@benserver C++]$ ./a.out 100
Allocation OK
[benoit@benserver C++]$ ./a.out 1000000
Allocation OK
[benoit@benserver C++]$ ./a.out 10000000
Allocation OK
[benoit@benserver C++]$ ./a.out 100000000
Allocation OK
[benoit@benserver C++]$ ./a.out 1000000000
St9bad_alloc


Message édité par Taz le 28-04-2003 à 11:25:47
n°374046
Konar
Posté le 28-04-2003 à 11:29:28  profilanswer
 

phod a écrit :

Slt :)
 
Je voudrais tout simplement tester si mon new a pus obtenir ou non de la memoire.
 
Sur le net on me dis un peut partout que new genere l'exception bad_alloc...  
 
je veut bien, mais comment je l'utilise ?
 
 
j'ai essayé pas mal de truc dont celui ci (qui ne compile pas : variable `class bad_alloc {anon}' has initializer but incomplete type)
 


void main(void)
{
    while (1) // on alloue jusqu'a epuisement de la RAM
    {
        try
        {
            char *a = new char[10000];
        }
        catch (bad_alloc) // Si le new a echoue...
        {
            cout << "exception bad_alloc recue !" << endl;
            exit(0);
        }
   }
}


 
Thx :)


 
Bon je sais pas kel compilo tu utilises mais ce code devrait marcher partout (testé sur Visual C++ 7)

Code :
  1. #include <new>
  2. #include <iostream>
  3. int main()
  4. {
  5. while (1) // on alloue jusqu'a epuisement de la RAM
  6. {
  7.  try
  8.  {
  9.   char *a = new char[10000];
  10.  }
  11.  catch (std::bad_alloc&) // Si le new a echoue...
  12.  {
  13.   std::cout << "exception bad_alloc recue !" << std::endl;
  14.   exit(0);
  15.  }
  16. }
  17. }


n°374094
Phod
Glouloulou ?
Posté le 28-04-2003 à 11:51:55  profilanswer
 

Konar, Taz>  Ca marche impec !  :jap: Merci [:prosterne]
 
Konar> GCC 2.95.3 sous Solaris...


Message édité par Phod le 28-04-2003 à 12:03:15

---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
n°375533
SoWhatIn22
Posté le 29-04-2003 à 09:22:38  profilanswer
 

Konar a écrit :


Bon je sais pas kel compilo tu utilises mais ce code devrait marcher partout (testé sur Visual C++ 7)


 
hum... je suis inquiet: je n'arrive pas à le faire fonctionner sous win2000 + VC 6.0 (alors que ca marche sous linux/solaris avec gcc 3.2, ainsi que win2000/cygwin/gcc3.2)
 
Qq1 d'autre peux essayer sous win2000 et VC6.0 ? C'est embetant que cela ne fonctionne pas...
 

Code :
  1. #include <iostream>
  2. #include <new>
  3. int main()
  4. {
  5.         while (1) // on alloue jusqu'a epuisement de la RAM
  6.         {
  7.                 try
  8.                 {
  9.                         std::cout << "allocating 100000000 bytes... ";
  10.                         char *a = new char[100000000];
  11.                         if( a )
  12.                                 std::cout << "done...\n";
  13.                         else
  14.                                 std::cout << "failure...\n";
  15.                 }
  16.                 catch (std::bad_alloc & e) // Si le new a echoue...
  17.                 {
  18.                         std::cout << "exception bad_alloc recue !" << std::endl;
  19.                         std::cin.get();
  20.                         exit(0);
  21.                 }
  22.                 catch(...)
  23.                 {
  24.                         std::cout << "generic exception recue !" << std::endl;
  25.                         std::cin.get();
  26.                         exit(0);
  27.                 }
  28.         }
  29.         return 0;
  30. }

n°375906
Taz
bisounours-codeur
Posté le 29-04-2003 à 13:29:32  profilanswer
 

vc est à la boure
 
 
rajoute des .h aux entetes et vire tous les std::, je pense que ça devrait marcher...

n°375909
SoWhatIn22
Posté le 29-04-2003 à 13:30:54  profilanswer
 

sowhatin22 a écrit :


 
hum... je suis inquiet: je n'arrive pas à le faire fonctionner sous win2000 + VC 6.0 (alors que ca marche sous linux/solaris avec gcc 3.2, ainsi que win2000/cygwin/gcc3.2)
 
Qq1 d'autre peux essayer sous win2000 et VC6.0 ? C'est embetant que cela ne fonctionne pas...


 
je me réponds à moi même.
Le pb semble être connu. Le standard C++ (ANSI) dit que new doit générer une exception de type bad_alloc. Le compilateur Visual C++ 6.0 ne respecte pas cette norme, contrairement au ompilateur 7.0 ( .NET ).
 
zut...

n°376220
Konar
Posté le 29-04-2003 à 14:54:22  profilanswer
 

++Taz a écrit :

vc est à la boure
 
 
rajoute des .h aux entetes et vire tous les std::, je pense que ça devrait marcher...


 
Je ne vois absolument pas le rapport. Les entetes avec ".h" comme tu dis, sont de tres vieux entetes, laissés uniquement pour compatibilité. Il NE faut PAS les utiliser.
 
De plus pour virer tous les std il suffit d'ecrire juste sous les #include  

Code :
  1. using namespace std;


 
Bon alors ensuite pour ce qui est du problème sous VC6. J'ai testé, ca compile. Ms il faut savoir ke VC6 date de 1998! (ptet meme 1997). Il respecte tres mal les standards C++ en ce qui concerne la STL surtout.
Notamment la gestion des exceptions est mal foutue. Il est donc possible que "new" ne throw pas la bonne exception.  
Compile avec VC7 si tu peux.
 
Bon courage.

n°376238
Taz
bisounours-codeur
Posté le 29-04-2003 à 14:58:00  profilanswer
 

spa qu'on va apprendre la norme... j'ai jamais touché à VC, j'ai juste donné des indications sur ce qui ne pourrait pas marchait....

n°376630
SoWhatIn22
Posté le 29-04-2003 à 16:42:42  profilanswer
 

Konar a écrit :


Bon alors ensuite pour ce qui est du problème sous VC6. J'ai testé, ca compile. Ms il faut savoir ke VC6 date de 1998! (ptet meme 1997). Il respecte tres mal les standards C++ en ce qui concerne la STL surtout.
Notamment la gestion des exceptions est mal foutue. Il est donc possible que "new" ne throw pas la bonne exception.  
Compile avec VC7 si tu peux.
 
Bon courage.


 
Bien sûr que cela compile. Mais au lieu de générer une exception, la fonction new renvoie un pointeur nul. En fait, si on veut que utiliser le mechanisme d'exception sur le new, je crois qu'il faut le dire explicitement. Si je reprends l'exemple précédent:
 

Code :
  1. #include <iostream>
  2. #include <new>
  3. #ifdef WIN32
  4. #include <new.h>
  5. int MyNewHandler( size_t size )
  6. {
  7.         std::bad_alloc e;
  8.         throw(e);
  9.         return 0;
  10. }
  11. #endif
  12. int main()
  13. {
  14. #ifdef WIN32
  15.        
  16.         // Set the failure handler for new to be MyNewHandler.
  17.         _set_new_handler( MyNewHandler );
  18.        
  19. #endif
  20.        
  21.         while (1) // on alloue jusqu'a epuisement de la RAM
  22.         {
  23.                 /// etc...
  24.         }
  25.         return 0;
  26. }


 
désolé, mais je suis obligé d'utiliser un .h parce que sinon, cela ne fonctionne pas. Je crois que je vais adopter cela, parce que c'est pas mal du tout, ce mécanisme d'exception quand la fonction new échoue.
 

mood
Publicité
Posté le 29-04-2003 à 16:42:42  profilanswer
 

n°376702
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 29-04-2003 à 17:04:03  profilanswer
 

sowhatin22 a écrit :


 
je me réponds à moi même.
Le pb semble être connu. Le standard C++ (ANSI) dit que new doit générer une exception de type bad_alloc. Le compilateur Visual C++ 6.0 ne respecte pas cette norme, contrairement au ompilateur 7.0 ( .NET ).
 
zut...


 
As-tu installé le dernier service pack de VC++ 6 ? (ça doit être le 5 ou le 6)


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran

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

  [C++] new - exception

 

Sujets relatifs
Exception in thread "main" java.lang.NoSuchMethodError: maintype d'une exception
Division par zéro en Java, exception non catchée ?comment baisser le timeout d'une exception??
petit probleme de c/cpp ... une exception que je ne comprends pasUne autre exception ????
[Java] - Qu'est ce qu'il peut justifier cette exception :??:[Linux prog syst] Exception à traiter dans une autre stack
pb!!!! unhandled exception..... : access violationCommunication d'une exception entre une servlet et une applet
Plus de sujets relatifs à : [C++] new - exception


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