IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

terminate called after throwing an instance of 'std::bad_alloc'


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 25
    Par d�faut terminate called after throwing an instance of 'std::bad_alloc'
    Bonjour � tous,

    Etant d�butant en C++, je me retrouve bloqu� face � ce probl�me: lorsque j'ex�cute mon programme avec un nombre �lev� d'it�rations (60 000, j'ex�cute en boucle un programme!), j'ai le message suivant:

    terminate called after throwing an instance of 'std::bad_alloc'

    Je pense que c'est d� � ma mauvaise conception de mon programme qui est le suivant:

    premier fichier: parametric.cc
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #include <ostream>
    #include "vnode.h"
     
    #include "Inputs.h"
    using namespace std;
    using namespace vnodelp;
     
     
     
    template<typename var_type>
    void parametric(int n,var_type*yp,const var_type*y,var_type t,void*param)
    /*
    	Parameters:
    	n	: size of
    */
    {
        Inputs*p = (Inputs*)param;
        interval a = p->a;
        interval b = p->b;
        interval c = p->c;
     
        yp[0] = a*(y[1]-y[0]);
        yp[1] = y[0]*(b-y[2])-y[1];
        yp[2] = y[0]*y[1]-c*y[2];
    }
     
    //iVector fct(interval param1, interval param2, interval param3, interval tend)
    iVector myProblem(Inputs input, interval tend)
    /*
    	mon programme
    	Parameters:
    	p	pointer to parameter struture Input
    	tend: pointer to final time interval for ^precision
     
    */
    {
        const int n = 3; // for security reasons
        interval t = 0.0;	// initial time t
        iVector y(n);	// vnode type. 
        y[0] = 15.0;
        y[1] = 15.0;
        y[2] = 36.0;
    	/*
    	Inputs table;
    	Inputs *p=(Inputs*)pInput;
        table.a = p->a;
        table.b = p->b;
        table.c = p->c;
    	*/
    	/*
    	Inputs table;
    	table.a = param1;
    	table.b = param2;
    	table.c = param3;
    	*/
     
     
        AD*ad = new FADBAD_AD(n,parametric,parametric,&input);
     
        VNODE*Solver = new VNODE(ad);
     
    	Solver->integrate(t,y,tend);
     
    	if(!Solver->successful())
    	cout<<"VNODE-LP could not reach t = "<<tend<<endl;
     
    	delete Solver;
    	delete ad;
    	//delete &n;
    	//delete &t;
     
        return y;
    }
    deuxi�me fichier: parametric.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef parametric
    #define parametric
    #include "vnode.h"
     
    #include "Inputs.h"
     
    iVector myProblem(Inputs input, interval tend);
    //iVector fct(interval param1, interval param2, interval param3, interval tend);
     
     
    #endif
    troisi�me fichier: executable.cc (qui contient mon main)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <ostream> 
    #include "parametric.h"
    #include "vnode.h"
    #include <time.h>
     
    int main() {
     
    int nbexecutions = 60000;
    interval tend = interval(0.001);
     
    Inputs parameterTable;
    parameterTable.a=interval(11,15);
    parameterTable.b=interval(11,12);
    parameterTable.c=interval(29,35);
     
    iVector i;
    int j;
     
    time_t debut, fin;
    double duree;
    debut=time(NULL);
     
    for (j=1; j<=nbexecutions; j++){
    	i = myProblem(parameterTable,tend);
    }
     
    fin=time(NULL);
    duree=difftime(fin, debut);
     
    printVector(i);
    cout<<"program duration : "<<duree<<endl;
     
    return 0;
    }
    toute aide sera la bienvenu !

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    734
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 734
    Par d�faut
    Difficile de juger en ne voyant que ce code. Tu accumules des objet en m�moire jusqu'� ce qu'un allocation �choue faute de m�moire (std::bad_alloc).
    Difficile de juger � ce stade...on ne voit pratiquement rien de ce qui se passe dans le code fourni.
    Un petit passage dans un outil de d�tection de fuites m�moire pourrait aider (ex: sous *nix, valgrind) en te fournissant des indications sur la provenance d'une �ventuelle fuite de m�moire (�a ne fait pas le caf�, hein...).
    Tu semble faire du calcul it�ratif par approximations successives: es-tu s�r de lib�rer la m�moire de chaque it�ration une fois la suivante calcul�e?
    Un indice de m�thodes risqu�es: tu alloues dynamiquement des variables locales:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    AD* ad=new FAB_AD(...);
    [...] 
    delete ad;
    Il suffirait dans ce cas de d�clarer une variable locale automatiquement d�sallou�e en sortie de scope:

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 25
    Par d�faut
    Merci therwald pour la r�ponse, j'ai essay� de cr�er une variable locale dans mon fichier parametric.cc en ajoutant les d�finitions de ad et solver:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    using namespace std;
    using namespace vnodelp;
    AD*ad;
    VNODE*Solver;
    mais le probl�me persiste !! la biblioth�que que j'utilise est une biblioth�que externe dont je ne maitrise pas le fonctionnement interne !! ce que j�essaie de faire c'est d'appeler le solveur de cette biblioth�que en boucle sans avoir besoin d'enregistrer quoi que ce soit !! c'�tait simplement pour estimer la dur�e d'ex�cution !!

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    734
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 734
    Par d�faut
    Citation Envoy� par issmaz Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    using namespace std;
    using namespace vnodelp;
    AD* ad;
    VNODE* Solver(ad);
    Des variables locales, pas des pointeurs:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    using namespace std;
    using namespace vnodelp;
    AD ad;
    VNODE Solver(&ad);
    Par ailleurs, n'y a-t-il pas des op�rations de lib�ration manuelle � effectuer par l'API de la lib? Sais-tu si elle accumule les r�sultats, et dans ce cas si elle offre des op�rations de lib�ration de ressources? Faute de quoi, tu as une consommation de m�moire qui cro�t avec le nombre d'it�rations, et tu ne pourras pas y �chapper...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 25
    Par d�faut
    Citation Envoy� par therwald Voir le message
    Des variables locales, pas des pointeurs:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    using namespace std;
    using namespace vnodelp;
    AD ad;
    VNODE Solver(&ad);
    Par ailleurs, n'y a-t-il pas des op�rations de lib�ration manuelle � effectuer par l'API de la lib? Sais-tu si elle accumule les r�sultats, et dans ce cas si elle offre des op�rations de lib�ration de ressources? Faute de quoi, tu as une consommation de m�moire qui cro�t avec le nombre d'it�rations, et tu ne pourras pas y �chapper...
    j'obtiens le message suivant � la compilation:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    parametric.cc:7:4: erreur: no matching function for call to 'vnodelp::AD::AD()'
    parametric.cc:7:4: note: candidates are:
    ./adabst.w:150:8: note: vnodelp::AD::AD(int, vnodelp::AD_ODE*, vnodelp::AD_VAR*)
    ./adabst.w:150:8: note:   candidate expects 3 arguments, 0 provided
    ./adabst.w:130:7: note: vnodelp::AD::AD(const vnodelp::AD&)
    ./adabst.w:130:7: note:   candidate expects 1 argument, 0 provided
    parametric.cc:7:4: erreur: cannot declare variable 'ad' to be of abstract type 'vnodelp::AD'
    ./adabst.w:130:7: note:   because the following virtual functions are pure within 'vnodelp::AD':
    ./adabst.w:136:13: note:        virtual int vnodelp::AD::getMaxOrder() const
    parametric.cc: In function 'v_blas::iVector myProblem(Inputs, v_bias::interval)':
    parametric.cc:57:55: erreur: lvalue required as left operand of assignment
    parametric.cc:59:27: erreur: no match for 'operator=' in 'Solver = (operator new(120u), (<statement>, ((vnodelp::VNODE*)<anonymous>)))'
    parametric.cc:59:27: note: candidate is:
    ./integ.w:12:7: note: vnodelp::VNODE& vnodelp::VNODE::operator=(const vnodelp::VNODE&)
    ./integ.w:12:7: note:   no known conversion for argument 1 from 'vnodelp::VNODE*' to 'const vnodelp::VNODE&'
    parametric.cc:61:8: erreur: base operand of '->' has non-pointer type 'vnodelp::VNODE'
    parametric.cc:63:12: erreur: base operand of '->' has non-pointer type 'vnodelp::VNODE'
    make: *** [parametric.o] Error 1
    Autre question, pourquoi la m�moire ne se lib�re pas lorsque je fait les commandes ??

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    delete Solver;
    delete ad;
    apparemment mauvais appel du constructeur ! Sinon y'a t-il un moyen de transformer tout cela en classe o� � chaque it�ration je cr�e un objet de la classe avec les param�tres que je veux et je le d�truit � la fin de mon it�ration !

    c'est peut �tre des questions basiques en c++ mais voila, je d�bute

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    734
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 734
    Par d�faut
    Oui, l'appel au constructeur devait avoir les m�mes arguments que dans ton code initial:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    FAB_AD ad(n,parametric,parametric,&input);
    ...sursimplification de ma part, d�sol�.
    Il faudrait �tudier la doc de la lib pour savoir si elle n'a pas un stockage statique, ou tenu par les objets que tu gardes, et s'il existe des m�thodes pour lib�rer ce stockage...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 25
    Par d�faut
    Citation Envoy� par therwald Voir le message
    Oui, l'appel au constructeur devait avoir les m�mes arguments que dans ton code initial:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    FAB_AD ad(n,parametric,parametric,&input);
    ...sursimplification de ma part, d�sol�.
    Il faudrait �tudier la doc de la lib pour savoir si elle n'a pas un stockage statique, ou tenu par les objets que tu gardes, et s'il existe des m�thodes pour lib�rer ce stockage...
    ok merci pour ton aide je vais me plonger dans la doc, je crois que c'est in�vitable

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 17/04/2014, 11h36
  2. R�ponses: 6
    Dernier message: 02/04/2014, 17h06
  3. std::bad_alloc Exception projet VCL
    Par mickyoun dans le forum C++Builder
    R�ponses: 4
    Dernier message: 15/10/2007, 17h48
  4. [debutant c++] std::bad_alloc
    Par Gotmere dans le forum SL & STL
    R�ponses: 2
    Dernier message: 28/05/2007, 20h42
  5. std::bad_alloc :'(
    Par mister3957 dans le forum SL & STL
    R�ponses: 25
    Dernier message: 22/03/2006, 21h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo