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 à l'essai
    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
    Points : 17
    Points
    17
    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 expérimenté
    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
    Points : 1 475
    Points
    1 475
    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 à l'essai
    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
    Points : 17
    Points
    17
    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 expérimenté
    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
    Points : 1 475
    Points
    1 475
    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 à l'essai
    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
    Points : 17
    Points
    17
    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 expérimenté
    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
    Points : 1 475
    Points
    1 475
    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 à l'essai
    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
    Points : 17
    Points
    17
    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