Bonjour,
J'ai ce code source:
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:Code:
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 } }
Savez-vous pourquoi Valgrind me génére cette erreur ?Citation:
==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)
Merci d'avance.