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ème de delete


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 Problème de delete
    Bonjour,

    J'ai ce code source:
    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
    	/**
            * Constructor
            * @param pos Position of the octree
            * @param size Size of the octree
            * @param depth Level of the octree (0 = leaf of the octree)
            * @param parent Parent of the octree
            */
    	Octree::Octree(const Point3<float> &position, const Vector3<float> &size, int depth, Octree *parent) :
    		parent(parent),
    		position(position),
    		size(size),
    		depth(depth)
    	{
    		//create 8 children
    		if(depth > 0)
    		{
    			const Vector3<float> &sizeChild = size / 2.0f;
     
    			//child 1
    			Point3<float> posChild = position;
    			children.push_back(new Octree(posChild, sizeChild, depth-1, this));
     
    			//child 2
    			posChild = position;
    			posChild.X = posChild.X + sizeChild.X;
    			children.push_back(new Octree(posChild, sizeChild, depth-1, this));
     
    			//child 3
    			posChild = position;
    			posChild.Z = posChild.Z + sizeChild.Z;
    			children.push_back(new Octree(posChild, sizeChild, depth-1, this));
     
    			//child 4, 5, 6, 7, 8
    			//...idem child 1, 2, 3
    		}
    	}
     
    	/**
            * Destructor
            */
    	Octree::~Octree()
    	{	
    		//delete children
    		for(vector<Octree *>::iterator it=children.begin(); it!=children.end(); ++it)
    		{
    			delete (*it); //line 96
    		}
    	}
    J'ai lancé Valgrind pour détecter les erreurs à l'éxécution et voici ce que j'obtiens quand je fait un delete de l'Octree:

    ==10229== Invalid read of size 4
    ==10229== at 0x40C96A4: __gnu_cxx::__normal_iterator<Cortex::Octreeable**, std::vector<Cortex::Octreeable*, std::allocator<Cortex::Octreeable*> > >::__normal_iterator(Cortex::Octreeable** const&) (stl_iterator.h:686)
    ==10229== by 0x40C8A99: std::vector<Cortex::Octreeable*, std::allocator<Cortex::Octreeable*> >::end() (stl_vector.h:444)
    ==10229== by 0x40C7038: Cortex::Octree::deleteOctreeable(Cortex::Octreeable const*) (Octree.cpp:168)
    ==10229== by 0x40D136F: Cortex::OctreeManager::deleteOctreeable(Cortex::Octreeable*) (OctreeManager.cpp:148)
    ==10229== by 0x40D1497: Cortex::OctreeManager::resetOctreeables() (OctreeManager.cpp:196)
    ==10229== by 0x40D13AE: Cortex::OctreeManager::getVisibleOctreeablesInFrustum() (OctreeManager.cpp:159)
    ==10229== by 0x40DBB24: Cortex::Renderer3d::display() (Renderer3d.cpp:320)
    ==10229== by 0x40DD758: Cortex::SceneManager::display() (SceneManager.cpp:233)
    ==10229== by 0x804DE51: GLWidget::paintGL() (GLWidget.cpp:99)
    ==10229== by 0x41750FA: QGLWidget::glDraw() (in /usr/lib/libQtOpenGL.so.4.7.0)
    ==10229== by 0x4173C1D: QGLWidget::paintEvent(QPaintEvent*) (in /usr/lib/libQtOpenGL.so.4.7.0)
    ==10229== by 0x43C3CC5: QWidget::event(QEvent*) (in /usr/lib/libQtGui.so.4.7.0)
    ==10229== Address 0x9561dd4 is 20 bytes inside a block of size 60 free'd
    ==10229== at 0x4025504: operator delete(void*) (vg_replace_malloc.c:387)
    ==10229== by 0x40C6CEC: Cortex::Octree::~Octree() (Octree.cpp:96)
    ==10229== by 0x40C6CE4: Cortex::Octree::~Octree() (Octree.cpp:96)
    ==10229== by 0x40C6CE4: Cortex::Octree::~Octree() (Octree.cpp:96)

    ==10229== by 0x40D1221: Cortex::OctreeManager::buildOctree(std::set<Cortex::Octreeable*, std::less<Cortex::Octreeable*>, std::allocator<Cortex::Octreeable*> >&) (OctreeManager.cpp:117)
    ==10229== by 0x40D1757: Cortex::OctreeManager::resizeOctree(Cortex::Octreeable*) (OctreeManager.cpp:235)
    ==10229== by 0x40D130F: Cortex::OctreeManager::addOctreeable(Cortex::Octreeable*) (OctreeManager.cpp:133)
    ==10229== by 0x40D14B3: Cortex::OctreeManager::resetOctreeables() (OctreeManager.cpp:197)
    ==10229== by 0x40D13AE: Cortex::OctreeManager::getVisibleOctreeablesInFrustum() (OctreeManager.cpp:159)
    ==10229== by 0x40DBB24: Cortex::Renderer3d::display() (Renderer3d.cpp:320)
    ==10229== by 0x40DD758: Cortex::SceneManager::display() (SceneManager.cpp:233)
    ==10229== by 0x804DE51: GLWidget::paintGL() (GLWidget.cpp:99)
    Savez-vous pourquoi Valgrind me génére cette erreur ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut
    Salut;

    As tu essayé de remplacer la boucle dans ton destructeur par :

    C'est la méthode la plus sure d'appeler le destructeur de tous les objets contenus dans un vecteur (ou une liste)...


    Cordialement,

    -----------------
    Adrien BARRAL
    REETI's development team
    http://www.reeti.fr

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut
    ERRRATUM ::

    J'avais pas vu que c'est des pointeurs vers Octree que tu met dans le vecteur, du coups mon message précedent est une énorme erreur...


    Adrien

  4. #4
    Invité de passage
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1
    Par défaut
    Bonjour,

    Essaye de résoudre ce problème:
    ==10229== by 0x40C7038: Cortex::Octree::deleteOctreeable(Cortex::Octreeable const*) (Octree.cpp:168)

    Fait attention avec Valgrind, les premières erreurs causent souvent d'autres erreurs par la suite.

  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
    Merci, je viens de comprendre comment interpréter l'erreur de Valgrind.

    L'erreur se trouve en effet dans la méthode "Cortex::Octree::deleteOctreeable()" qui essaye d'accèder à une zone mémoire deleté dans le destructeur de la classe "Octree".

    Plus d'info ici: http://people.gnome.org/~newren/tuto...l/ch03s03.html

    Merci.

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

Discussions similaires

  1. Problème de delete d'une ligne Excel
    Par Charlie47 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/08/2006, 14h55
  2. Problème RunSql Delete
    Par lito74 dans le forum Access
    Réponses: 5
    Dernier message: 29/05/2006, 13h13
  3. [version 8.1] problème de delete massif
    Par XPierrot dans le forum DB2
    Réponses: 6
    Dernier message: 12/01/2006, 16h01
  4. [VB]problème avec DELETE
    Par jogu dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/01/2006, 10h53
  5. Problème de DELETE
    Par WinZy dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 12h58

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