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

Qt Creator Discussion :

free(): invalid pointer


Sujet :

Qt Creator

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut free(): invalid pointer
    Bonjour,
    J'ai une classe Coefficient d'une part. Elle possède des tenseurs (<vector <vector< vetor double>>> C,S et V, et des méthodes:
    - constructeur-> initialise C et S
    - readfile-> rempli C et S
    - calcul_potentiel-> initialise et rempli V à l'aide de C et S
    - calcul_potentiel_paire-> initialise et rempli V à l'aide de C et S
    - calcul_potentiel_impaire-> initialise et rempli V à l'aide de C et S
    - draw()

    D'autre part j'ai ma classe mainwindow avec différents onglets, boutons et
    des slots. Et il y a certain slots que j'arrive pas à faire marcher
    Ce que j'ai fait:
    -chargement()-> appelle le constructeur de Coefficient et redfile()
    - potentiel()-> appelle calcul_potentiel() et draw()
    - potentiel_paire()-> appelle calcul_potentiel_paire() et draw()
    de même pour potentiel impaire.

    J'ai défini 2 pointeurs CoefficientEGM * egm_model; etCoefficientGRACE * grace_model pour pouvoir utiliser les attributs et méthodes de CoefficientXXX dans mainwindow. Mais lorsque j'execute mon script, j'ai une fermeture prématurée de mon application.
    Avec ceci comme message (extrait):
    "*** Error in `/home/marie/qt_project/build-essai-Desktop-Debug/essai': free(): invalid pointer: 0x000000000042feca ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x80a46)[0x7f2a6d203a46]
    ...
    /home/marie/qt_project/build-essai-Desktop-Debug/essai[0x4166a4]
    /home/marie/qt_project/build-essai-Desktop-Debug/essai[0x4154c4]
    var/cache/fontconfig/e0aa53bcfa504e64f87823c16bc01eb6-le64.cache-3
    7f4486774000-7f4486777000 r--p 00000000 08:05 4990437
    /usr/share/locale-langpack/fr/LC_MESSAGES/atk10.mo
    7f4486777000-7f4486786000 r--p 00000000 08:05 4990326
    /usr/share/locale-langpack/fr/LC_MESSAGES/gtk20.mo
    7f4486786000-7f448678d000 r--s 00000000 08:05 4855962
    /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
    7f448678d000-7f4486790000 rw-p 00000000 00:00 0
    7f4486790000-7f4486791000 r--p 00022000 08:05 131602
    /lib/x86_64-linux-gnu/ld-2.17.so
    7f4486791000-7f4486793000 rw-p 00023000 08:05 131602
    /lib/x86_64-linux-gnu/ld-2.17.so
    7fffa1b2d000-7fffa1b4e000 rw-p 00000000 00:00 0
    [stack]
    7fffa1bfe000-7fffa1c00000 r-xp 00000000 00:00 0
    [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0
    [vsyscall]
    The program has unexpectedly finished."


    Voici le code de ma classe MainWindow:
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "glwidget.h"
    //#include "myogldraw.h"
    #include "coefficientegm.h"
    #include "coefficientgrace.h"
     
    #include <iostream>
    #include <QString>
    #include <QFileDialog>
    #include <QKeyEvent>
     
    //--------------------------------------- Initialisation de Mainwindow -----------------------------------
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QObject::connect(ui->comboBox,SIGNAL(activated(QString)),this,SLOT(on_comboBox_activated(QString)));
        QObject::connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(on_sliderChanged(int)));
        QObject::connect(ui->degre_min,SIGNAL(valueChanged(int)),this,SLOT(on_degreeMax()));
     
        glWidget = new myogldraw(ui->dessin);
     
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::keyPressEvent(QKeyEvent *e)
    {
        if (e->key() == Qt::Key_Escape)
            close();
        else
            QWidget::keyPressEvent(e);
    }
     
    //--------------------------------------- SLOTS -----------------------------------
    //------------ Chargement des donnees
     
    CoefficientEGM MainWindow::on_actionChargement_EGM_triggered()
    {
        egm_mode = new CoefficientEGM l;
        // Recuperer nom d'un fichier par une fenetre
        QString fileName = QFileDialog::getOpenFileName(this, "Open File",
                                                        "/home/marie/Geoide/data/EGM/EGM2008_to2190_TideFree.txt",
                                                        "Text (*.txt)");
     
        egm_model->readFile(fileName);
        std::cout<<"chargement termine "<< std::endl;
    }
     
    CoefficientGRACE MainWindow::on_actionChargement_GRACE_triggered()
    {
        grace_mode0 = new CoefficientGRACE l;
     
        // Recuperer nom d'un repertoire par une fenetre
        QString dir_name = QFileDialog::getExistingDirectory(this, "Open Directory",
                                                    "/home/marie/Geoide/data/GRGS/SH_models",
                                                    QFileDialog::ShowDirsOnly
                                                    | QFileDialog::DontResolveSymlinks);
     
        // On fait une liste avec le nom de tous les fichiers
        QDir dir(dir_name);
        QFileInfoList list = dir.entryInfoList(QDir::Files);
        // Pour chaque fichier, on remplit C et S
        for (int i = 0; i < list.size(); ++i) {
            QFileInfo fileInfo = list.at(i);
            std::cout<<fileInfo.filePath().toStdString()<<std::endl;
            grace_model->readFile(fileInfo.filePath(), i);
         }
        std::cout<<"chargement effectue"<< std::endl;
    }
     
     
    // --------------- Action des boutons (parametres)
     
    // Redimensionnement du choix du degre maximal en fonction des donnees choisies
    void MainWindow::on_comboBox_activated(const QString &arg1)
    {
        int degreeMax=0;
        if (arg1=="EGM"){
            degreeMax=2190;
        }else if (arg1=="GRACE"){
            degreeMax=50;
       }
        ui->degre_max->setMaximum(degreeMax);
    }
     
    // Redimensionnement du choix du degre minimal en fonction des donnees choisies
    void MainWindow::on_degreeMax()
    {
        int degreeLimit=ui->degre_max->value();
        ui->degre_min->setMaximum(degreeLimit);
    }
     
    // Affichage du facteur d'echelle
    void MainWindow::on_sliderChanged(const int &arg1)
    {
        ui->facteur->setText(QString("%1").arg(ui->horizontalSlider->value()));
    }
     
     
     
    // --------------   Calcul du geoide et affichage
     
    void MainWindow::on_actionGeoide_triggered()
    {
        int degreeMin = ui->degre_min->value();
        int degreeMax = ui->degre_max->value();
        QString model = ui->comboBox->currentText();
     
        if (model=="EGM")
            egm_model->potentiel(degreeMin,degreeMax);
        else if (model=="GRACE")
            grace_model->potentiel(degreeMin,degreeMax);
     
    }
     
    void MainWindow::on_actionHarmoniques_paires_triggered()
    {
        int degreeMin = ui->degre_min->value();
        int degreeMax = ui->degre_max->value();
        QString model = ui->comboBox->currentText();
     
        if (model=="EGM")
            egm_model->potentiel_paire(degreeMin,degreeMax);
        else if (model=="GRACE")
            grace_model->potentiel_paire(degreeMin,degreeMax);
     
    }
     
    void MainWindow::on_actionHarmoniques_impaires_triggered()
    {
        int degreeMin = ui->degre_min->value();
        int degreeMax = ui->degre_max->value();
        QString model = ui->comboBox->currentText();
     
        if (model=="EGM")
            egm_model->potentiel_impaire(degreeMin,degreeMax);
        else if (model=="GRACE")
            grace_model->potentiel_impaire(degreeMin,degreeMax);
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Une bonne méthode pour connaitre où cela plante, surtout lorsque c'est une erreur de segmentation, c'est d'exécuter le programme dans le débogueur.

    grace_mode0 = new CoefficientGRACE l;
    Il manque des parenthèses ?

    Il se peut aussi que vous ayez des fuites de mémoire (il manque des delete).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour ton aide. J'ai effectivement oublié les parenthèses.

    Je n'arrive pas à faire marcher le debugger. Je suis en mode degug et j'ai aussi dans le .pro CONFIG += debug. Quand j'essaye de le lancer j'ai une fenêtre d'erreur avec ptrace() introuvable.

    J'ai rajouté des destructeurs dans mes classes CeofficientXXX que j'ai ensuite appelé dans le destructeur de MainWindow.
    Qt me dit "type double argument given to delete, expected pointer au niveau de mes classes CoefficientXXX.cpp

    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
     
    CoefficientGRACE::~CoefficientGRACE()
    {
        for(int i=0;i<n_GRACE+1;i++)
        {
            for (int j=0;j<i+1;j++)
            {
                for (int k=0;k<342;k++)
                {
                    delete C_GRACE[i][j][k];delete S_GRACE[i][j][k];
                }
     
            }
        }
     
        for(int i=0;i<nb_pas_colat+1;i++)
        {
            for (int j=0;j<nb_pas_lon+1;j++)
            {
                for (int k=0;k<342;k++)
                {
                    delete V_GRACE[i][j][k];
                }
     
            }
        }
    }
    Scapine

Discussions similaires

  1. Invalid pointer avec librairie stl
    Par obito dans le forum Débuter
    Réponses: 8
    Dernier message: 23/04/2010, 16h56
  2. 0x80004003 (NS ERROR INVALID POINTER)
    Par crocodile dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/12/2009, 20h14
  3. qu'est ce que 'Invalid pointer operation' ?
    Par savoir dans le forum Langage
    Réponses: 4
    Dernier message: 24/08/2009, 00h53
  4. free(): invalid next size (normal)
    Par Heimdall dans le forum C
    Réponses: 18
    Dernier message: 02/01/2008, 11h25
  5. * glibc detected * free(): invalid pointer
    Par ViRouF dans le forum C
    Réponses: 4
    Dernier message: 28/03/2007, 17h10

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