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 :

Problèmes de STL entre différents projets


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Problèmes de STL entre différents projets
    Bonjour à tous !

    La STL me pose quelques soucis et j'ai dans l'espoir que l'un d'entre vous puisse m'apporter un élément de réponse !
    Je travail avec la version Visual C++ 2008 Express.

    Mon problème se résout à ces quelques lignes de codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	std::list<int*> l1; 
    	l1.push_back(new int(5)); 
     
    	std::list <double*> l2 ;
    	l2.push_back(new double (5));
     
    	std::list <float*> l3;
    	l3.push_back(new float (5));
    Ce bout de code est placé dans une fonction d'une librairie externe.
    Lorsque je l'appelle à partir de mon premier projet (une Application Win32 Console) tout se déroule pour le mieux (ce qui me parait logique puisque le bout de code semble cohérent).

    Je tente alors de l'utiliser dans mon deuxième projet (un projet utilisant le moteur OGRE3D), et j'obtiens alors l'erreur suivante "list insert iterator outside range" à la dernière ligne ("l3.push_back(new float (5));").

    Avez-vous une idée de quel type d'erreur il s'agit?
    existe t - il des propriétés de projet qui pourraient corrompre l'utilisation de la STL ? ...

    bref... je suis preneur de toutes suggestions !

  2. #2
    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
    Points : 3 344
    Points
    3 344
    Par défaut
    Clairement le problème viens de l'environnement du projet, donc de code source autre que celui ci.

    Il va falloir isoler le code voir si c'est bien quelque chose avant ce code ci qui (apparamment) corrompt les données.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut, et bienvenue sur le forum.

    Avant de penser à te répondre, j'aurais volontiers une question (surement idiote) à te poser, mais...

    Pourquoi utiliser des pointeurs et l'allocation dynamique de la mémoire dans la collection, alors que de objets "normaux" iraient tout aussi bien

    En effet, les différentes collections de la STL souffrent d'un désagrément majeur lorsqu'elles contiennent des pointeurs: elle ne libèrent pas la mémoire allouée aux dits pointeurs lors de leur destruction.

    Si tu n'y prend pas garde, tu risque donc de te trouver très facilement en présence de fuites mémoires qui finiront tôt ou tard par s'avérer fatales pour l'application, voire, pour le système tout entier...

    De plus, l'utilisation de pointeurs ne se justifie généralement que dans deux cas, qui ne semblent pas être présents dans le code que tu présente:

    Soit il s'agit de liens vers des objets dont la durée de vie est gérée "par ailleurs" (par une autre collection ), soit tu te trouve dans un contexte d'héritage et de polymorphisme, et tu décide de créer une collection de pointeurs sur des objets qui passent pour être du type de base, mais tu y place... des objets du type dérivés.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par Dodidou Voir le message
    existe t - il des propriétés de projet qui pourraient corrompre l'utilisation de la STL ? ...
    Oui, typiquement, avec visual studio il faut bien faire attention à ce que toutes les dlls utilisées et tous les projets d'une même solution soient compilés avec les mêmes options de debug/check de la STL: _HAS_ITERATOR_DEBUGGING et _SECURE_SCL. Sinon, ça peut mener à des bugs extremement bizarres et difficiles à debugger. (par exemple, les itérateurs n'ont pas la même taille si _SECURE_SCL vaut zero ou un... ça peut mettre un sacré boxon)

    Les projets par défaut sous vs2005/2008 activent les checks d'itérateur, même en release, alors qu'un projet Ogre3D désactive probablement tout, pour obtenir les meilleures performances possibles. Il faudrait vérifier.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Voir aussi cette discussion : si tu as des warnings 4251 (level 4 requis) en compilant ton code, alors les résoudre devrait lever ton crash à l'exécution.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci à tout le monde pour l'aide que vous avez apportée !
    Grâce à vous j'ai enfin résolu mon problème.

    J'ai commencé par suivre les conseils de Klaim, en essayant d'isoler au mieux le code source bloquant.
    J'ai commenté la plupart de mon projet et j'ai enlevé toutes les librairies utilisées.
    Au départ, lorsque j'appelle ma fonction en début de programme, mon application génère la fameuse erreur "list insert iterator outside range". Après avoir tout commenté, la fonction ne pose plus aucun problème : étrange non ?!!
    Petit à petit j'ai ensuite rajouté et décommenté le code. Bien que l’exercice soit long et pénible, j’en suis finalement arrivé au stade où j’ai identifié la fonction faisant planter le bout de code. Ce qui devient embêtant c’est que cette fonction appartient à la librairie OpenCV (cvSetIdentity). Casse-tête : comment la jolie fonction OpenCV peut – elle corrompre la totalité de mon projet ? D’autant plus que la fonction n’est pas du tout appelée, mais simplement compilée dans le programme !

    Après avoir maudit Visual C++ sur plusieurs générations, je retourne sur le site de developpez.com.
    Pour répondre à koala01, je n’ai pas choisit d’utiliser l’allocation dynamique dans ma list. Un collègue de travail a écris cette librairie et en théorie je n’ai pas à y retoucher. De même, merci Mac LAK, mais je n’avais pas ce genre de warning. Mais encore une fois : merci bien à tout deux !

    Je me suis alors attardé sur le post d’Arzar. Effectivement mes deux projets n’avaient pas la même valeur pour _HAS_ITERATOR_DEBUGGING : mon projet Ogre étant compilé avec l’option NDEBUG !
    Je change alors le NDEBUG en _DEBUG ! Saint-Graal de la programmation : mon bout de code fonctionne parfaitement, même avec l’appelle à la fonction OpenCV ! Je décommente la totalité, je test : tout fonctionne…

    Moralité… je ne comprends toujours pas ce qu’il s’est passé ! Je pensais qu’on pouvait sans problème utiliser une librairie de Release dans un projet Debug, et inversement.

    Pour une fois qu’un lundi matin commence bien ….
    Au risque de me répéter : Merci pour votre aide !

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Dodidou Voir le message
    Moralité… je ne comprends toujours pas ce qu’il s’est passé ! Je pensais qu’on pouvait sans problème utiliser une librairie de Release dans un projet Debug, et inversement.
    Houlà, non, loin de là même !

    Exemple typique, l'allocation mémoire : Visual introduit du code spécifique lors du malloc / free pour vérifier si tu n'as pas débordé, et également initialise de façon particulière les variables locales en mode Debug.

    Le cas classique, c'est d'allouer la mémoire en Release, et de la libérer en Debug : comme le free va vérifier les marqueurs d'allocation et qu'il ne va PAS les trouver (et pour cause...), tu vas direct dans un "Heap corruption error", et une exception qui va être levée dans ton debugger.
    Dans l'autre sens, ce n'est guère mieux : ton malloc Debug va allouer un peu plus de mémoire que ce que tu as demandé (pour ces fameux marqueurs), que le free Release ne pourra PAS libérer, ou alors, seulement partiellement... Dans les deux cas, tu as une fuite mémoire.

    Et ça, c'est seulement le cas le plus simple : tu as des dizaines (centaines ?) de cas vicieux pouvant se produire lorsque tu mélanges du code Release et du code Debug, sans parler de différences de comportement de certaines fonctions... La plus connue, c'est l'assertion qui est tout simplement éliminée en mode Release : dommage si tu faisais un appel de fonction important dans la condition de l'assertion, car elle va purement et simplement sauter en Release, alors qu'elle sera bien appelée en Debug...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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

Discussions similaires

  1. [EJB3] [Eclipse] problème de références entre un projet EJB et son client
    Par olivier57b dans le forum Java EE
    Réponses: 2
    Dernier message: 17/03/2010, 16h00
  2. [GPS] Problème trames NMEA entre différents modèles de PDA
    Par Julien_G dans le forum Windows Mobile
    Réponses: 3
    Dernier message: 14/05/2009, 12h07
  3. Comment "communiquer" entre différents projets ?
    Par kasparov2008 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 29/08/2008, 10h58
  4. Comment "communiquer" entre différents projets ?
    Par StormimOn dans le forum C#
    Réponses: 17
    Dernier message: 08/07/2008, 13h55
  5. [C#] liens entre différents projets
    Par rastali dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/12/2005, 10h07

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