[C++] new - exception

new - exception [C++] - C++ - Programmation

Marsh Posté le 28-04-2003 à 11:18:34    

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
Reply

Marsh Posté le 28-04-2003 à 11:18:34   

Reply

Marsh Posté le 28-04-2003 à 11:25:14    

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
Reply

Marsh Posté le 28-04-2003 à 11:29:28    

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. }


Reply

Marsh Posté le 28-04-2003 à 11:51:55    

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
Reply

Marsh Posté le 29-04-2003 à 09:22:38    

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. }

Reply

Marsh Posté le 29-04-2003 à 13:29:32    

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

Reply

Marsh Posté le 29-04-2003 à 13:30:54    

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...

Reply

Marsh Posté le 29-04-2003 à 14:54:22    

++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.

Reply

Marsh Posté le 29-04-2003 à 14:58:00    

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....

Reply

Marsh Posté le 29-04-2003 à 16:42:42    

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.
 

Reply

Marsh Posté le 29-04-2003 à 16:42:42   

Reply

Marsh Posté le 29-04-2003 à 17:04:03    

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
Reply

Sujets relatifs:

Leave a Replay

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