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

Langage C++ Discussion :

Operateur new qui plante


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut Operateur new qui plante
    Bonjour,

    J'ai ce code source qui plante à l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string test =  ConfigService::instance()->getStringValue("skybox.XNegative");
    Apparement, mon programme ne rentre même pas dans la méthode 'instance()' ni dans 'getStringValue()'. J'ai l'impression qu'il plante à la création de la string 'skybox.XNegative' !

    Voici la stacktrace que j'ai en debug: http://imageshack.us/photo/my-images/832/debugv.png/
    Pour info, j'ai encore plein de mémoire vive de libre sur mon PC, donc il ne devrait pas y avoir de problème pour allouer cette mini string.

    Une idée d'où peut venir cette erreur étrange ?

    Merci d'avance.
    Grégory

    Edit: même erreur avec le code suivant 'std::string a = "skybox.XNegative";'.
    A mon avis l'erreur vient d'autre part mais je ne sais pas où ni quoi chercher.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,

    A mon avis, l'erreur vient de new Image*[6] et (probablement) ses autres petits copains : un écrasement mémoire, un double delete, etc... => bref, std::vector, std::unique_ptr (ou boost::shared_ptr si pas d'unique_ptr dispo).

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Merci pour votre réponse:
    - A mon avis l'erreur ne vient pas de 'new Image*[6]', ce code source fonctionne depuis des mois
    - Entièrement d'accord pour le std::vector.

    Je viens de faire un rollback de mes dernières modifications en date et quand je supprime un attribut (unsigned int) d'une de mes classes (Camera), le programme s'éxécute correctement.

    Par contre Valgrind détecte quand même une erreur quand le programme fonctionne correctement:
    ==16634== Invalid write of size 4
    ==16634== at 0x4100B50: cortex::FreeCamera::FreeCamera(float, float, float) (FreeCamera.cpp:26)
    ==16634== by 0x804CB99: MyCamera::MyCamera(float, float, float, QWidget const*) (GLWidget.cpp:11)
    ==16634== by 0x804CEA0: GLWidget::initializeGL() (GLWidget.cpp:51)
    ==16634== by 0x41885AF: QGLWidget::glInit() (qgl.cpp:4490)
    ==16634== by 0x41FD0B2: QGLWidget::resizeEvent(QResizeEvent*) (qgl_x11.cpp:1440)
    ==16634== by 0x4403F79: QWidget::event(QEvent*) (qwidget.cpp:8449)
    ==16634== by 0x418DFE1: QGLWidget::event(QEvent*) (qgl.cpp:4302)
    ==16634== by 0x43A9D53: QApplicationPrivate::notify_helper(QObject*, QEvent*) (qapplication.cpp:4486)
    ==16634== by 0x43AF1A7: QApplication::notify(QObject*, QEvent*) (qapplication.cpp:4451)
    ==16634== Address 0x97ccce0 is 0 bytes after a block of size 248 alloc'd
    ==16634== at 0x402842F: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==16634== by 0x804CE71: GLWidget::initializeGL() (GLWidget.cpp:51)
    ==16634== by 0x41885AF: QGLWidget::glInit() (qgl.cpp:4490)
    ==16634== by 0x41FD0B2: QGLWidget::resizeEvent(QResizeEvent*) (qgl_x11.cpp:1440)
    ==16634== by 0x4403F79: QWidget::event(QEvent*) (qwidget.cpp:8449)
    ==16634== by 0x418DFE1: QGLWidget::event(QEvent*) (qgl.cpp:4302)
    ==16634== by 0x43A9D53: QApplicationPrivate::notify_helper(QObject*, QEvent*) (qapplication.cpp:4486)
    ==16634== by 0x43AF1A7: QApplication::notify(QObject*, QEvent*) (qapplication.cpp:4451)
    Ligne 51 de GLWidget: MyCamera *camera = new MyCamera(60.0f, 0.1f, 1000.0f, static_cast<QWidget*>(this->parent()));
    => Rien d'étrange à mes yeux. Si je supprime le dernier argument, j'ai le même problème.

    Ligne 26 de FreeCamera: speed = ConfigService::instance()->getFloatValue("freeCamera.defaultSpeed");
    => J'ai du mal à comprendre Valgrind: 'Invalid write of size 4'.

    Bref, je suis totalement perdu et je ne sais plus où chercher
    Mon programme a fonctionné pendant des mois et quand j'ajoute quelques attributs à une classe: boum.
    A ce que je sache, on est pas limité en nombre d'attributs pour une classe. Ma classe Camera (et ses fils: FreeCamera & MyCamera) ont: 2 bool, 52 float, 2 ptr, 14 int.

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    A mon avis l'erreur ne vient pas de 'new Image*[6]', ce code source fonctionne depuis des mois

    Ca ne veut rien dire, et c'est le principal danger quand on manipule des pointeurs nus : le problème peu se révéler bien plus tard. En l'occurence, il suffit que la mémoire affectée n'ai jamais été utilisée...jusqu'aà ce qu'un bout de code l'utilisant ai été introduit, des mois plus tard.


    C'est juste une remarque générale, je n'ai pas regardé plus que ça ton problème.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Je viens encore de supprimer un autre attribut (unsigned int) à ma classe Camera et Valgrind ne me détecte plus aucune erreur.
    Je pense donc que Valgrind est aussi perdu que moi: il ne sais pas d'où vient l'origine du problème

    Si je comprends bien vos commentaire, ce genre d'erreur peut arriver quand:
    * On tente de déréférencer un pointeur qui contient une valeur aléatoire (pointeur non initialisé/vide)
    * On tente d'accéder a un élément d'un tableau qui est en dehors des limites (array out of bounds)

    Je viens d'oublier explicitement d'initiliser 'texSkybox[0]' (texSkybox = new Image*[6]). Dans ce cas, Valgrind me détecte directement mon problème au moment du déréférencement.

    Je suis totalement perdu: où chercher ? quoi chercher ? avec quoi ?
    Merci d'avance.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je me demande si le problème n'est pas lié à une recompilation incomplète, qui ferait que les mêmes objets seraient vu avec des tailles et des données membre différentes selon le bout de code qui y accède. Est-ce que tu peux effacer tout le code généré, et recommencer une compilation à zéro ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Novice] Problème avec Eclipse 3.0.x qui plante
    Par esolarc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 13h22
  2. Programme qui plante
    Par harris_macken dans le forum C++
    Réponses: 1
    Dernier message: 22/05/2005, 23h50
  3. Pc qui plante
    Par tooms2028 dans le forum Ordinateurs
    Réponses: 9
    Dernier message: 19/03/2005, 17h32
  4. [JTextArea] redessin qui plante
    Par phil_ma dans le forum Composants
    Réponses: 3
    Dernier message: 04/01/2005, 05h19
  5. [JDBC]Un new qui renvoie null...
    Par Ditch dans le forum JDBC
    Réponses: 4
    Dernier message: 03/01/2005, 13h14

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