Salut tout le monde,
Premièrement, excusez moi si mes questions sont "bêtes" mais il faut bien commencer, je suis en train d'apprendre C++. La j'en suis au traitement des exceptions, plus particulièrement à la défaillance de "new".
Dans le livre que j'ai, ils donnent 3 méthodes.
La première, ci dessous, marche très bien. Après avoir bouclé une quarantaine de fois, ça finit par me donner le message d'erreur:
Code :
//Démonstration de new retournant 0
#include <iostream.h>
int main()
{
double *ptr[50];
for (int i=0;i<50;i++)
{
ptr[i] = new double[5000000];
if (ptr[i]==0)
{
cout << "L'allocation memoire a echoue pour ptr[" << i << "]." << endl;
break;
}
else
{
cout << "5000000 doubles alloues a ptr[" << i << "]." << endl;
}
}
return 0;
}
La deuxième méthode (bad_alloc), elle, je peux la faire boucler 100000 de fois, ça défile a une vitesse folle et ne plante jamais. On dirait qu'il ne crée même pas les double:
Code :
//Démonstration de new lançant un bad_alloc
#include <iostream>
using std::cout;
using std::endl;
#include <new>
using std::bad_alloc;
int main()
{
double *ptr[ 50000 ];
try {
for ( int i = 0; i < 50000; i++ ) {
ptr[ i ] = new double[ 5000000 ];
cout << "500000 doubles alloues a ptr[ "
<< i << "]\n";
}
}
catch ( bad_alloc exception ) {
cout << "Exception produite: "
<< exception.what() << endl;
}
return 0;
}
Enfin, la troisième méthode (set_new_handler) ne compile même pas.
Code :
//Démonstration de set_new_handler
#include <iostream>
using std::cout;
using std::cerr;
#include <new.h>
#include <cstdlib>
using std::set_new_handler;
void gestionNew()
{
cerr << "Plante";
abort();
}
int main()
{
double *ptr[100];
set_new_handler(gestionNew);
for (int i=0 ; i<100 ; i++)
{
ptr[i] = new double[5000000];
cout << "5000000 doubles alloues a ptr[" << i << "]." << endl;
}
return 0;
}
L'erreur à la compilation du dernier est :
Code :
newFailure set_new_handler .cpp
...\newfailure set_new_handler .cpp(9) : error C2039: 'set_new_handler' : is not a member of 'std'
...\newfailure set_new_handler .cpp(9) : error C2873: 'set_new_handler' : symbol cannot be used in a using-declaration
...\newfailure set_new_handler .cpp(26) : error C2065: 'endl' : undeclared identifier
Error executing cl.exe.
(J'ai volontairement remplacé le path par ... pour alléger le texte)
Quelqu'un peut-il me dire ce qui ne va pas avec les deux dernières méthodes?
Pour informations, j'utilise Visual Studio 6 sous Windows XP Pro.
Merci,
Simo