Nous sommes actuellement le 10 Juil 2026, 14:44

Le fuseau horaire est UTC-5 heures [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 2 message(s) ] 
Auteur Message
MessagePublié: 18 Déc 2004, 23:30 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

Inscription : 25 Jan 2002, 06:05
Message(s) : 502
Localisation : Montréal
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

_________________
Desktop : Core2 Duo E8600 3.33GHz - 8GB DDR3 - 2x NVIDIA GeForce 9600 GT - 3x Fujitsu 22" - Win7 Ultimate
Laptop - Asus V1V : Core2 Duo P8600 2.4GHz - 4GB DDR2 - ATI Mobility Radeo HD 3650 - Win7 Ultimate
Tablet - Asus Transformer Prime : NVIDIA Tegra 3 Quad-core - 1GB - Android ICS


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 20 Déc 2004, 10:27 
Hors-ligne
Toujours là!
Toujours là!
Avatar de l’utilisateur

Inscription : 08 Jan 2002, 14:51
Message(s) : 1337
Localisation : Québec
Effectivement j'ai essayé votre deuxième et troisième méthode sous VS6 et elles ne fonctionnent pas. Il y a peut-être une "switch" de compilation à ajouter, mais je ne l'ai pas trouvé dans la documentation. VS6 n'est malheureusement pas tout à fait standard pour le C++ alors ça risque de vous arriver quelques fois.

J'ai fait le test avec les deux programmes suivant avec VS.NET 2003 et ils fonctionnent très bien.

Code :
#include <new>
#include <iostream>

using namespace std;

int main()
{
   try
   {
      while (true)
      {
         int* p = new int[5000000];
         cout << "Allocating 5000000 ints." << endl;
      }
   }
   catch (bad_alloc &e)
   {
      cout << e.what() << endl;
   }
}


Code :
#include<new>
#include<iostream>

using namespace std;

void __cdecl newhandler( )
{
   cout << "The new_handler is called:" << endl;
   throw bad_alloc( );
   return;
}

int main( )
{
   set_new_handler(newhandler);

   try
   {
      while (true)
      {
         int* p = new int[5000000];
         cout << "Allocating 5000000 ints." << endl;
      }
   }
   catch (bad_alloc &e)
   {
      cout << e.what( ) << endl;
   }
}


Haut
 Profil  
Répondre en citant  
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 2 message(s) ] 

Le fuseau horaire est UTC-5 heures [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum

Recherche de:
Aller vers :  
cron
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en françaisHébergement de site