Bonjour,

Nous ne comprenons pas pourquoi le code suivant ne fonctionne pas :

Nous avons deux objet dans un vector. On supprime le premier élément par erase(begin), mais cela modifie aussi le second élément...

Le problème se produit avec codegear, visual studio 2008 et gcc.

Une idée ?

Merci d'avance

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
#include <vector>
#include <cstdio>
 
class A {
    int *m_pi;
 
  public:
     A() {
        m_pi = new int[10];
        printf("constructeur %p (%p)\n", this, m_pi);
    } 
 
    A(const A & ref) {
        m_pi = new int[10];
        printf("constructeur recopie %p de %p (%p)\n", this, &ref, m_pi);
    }
 
    ~A() {
        printf("destructeur de %p (%p)\n", this, m_pi);
        delete[]m_pi;
        m_pi = NULL;
    }
    void tell() {
        printf("je suis %p et je pointe sur %p\n", this, m_pi);
    }
};
 
 
int main()
{
    std::vector < A > vect;
 
    vect.push_back(A());
    vect.push_back(A());
 
    for (int i = 0; i < vect.size(); ++i) {
        vect[i].tell();
    }
    vect.erase(vect.begin());
 
    for (int i = 0; i < vect.size(); ++i) {
        vect[i].tell();
    }
 
    vect.erase(vect.begin());
 
    return 0;
}
Voilà la trace :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
constructeur 0x22ccfc (0xdf0230)
constructeur recopie 0xe00298 de 0x22ccfc (0xe002a8)
destructeur de 0x22ccfc (0xdf0230)
constructeur 0x22cd00 (0xdf0230)
constructeur recopie 0xe002d8 de 0xe00298 (0xe002e8)
constructeur recopie 0xe002dc de 0x22cd00 (0xe00318)
destructeur de 0xe00298 (0xe002a8)
destructeur de 0x22cd00 (0xdf0230)
je suis 0xe002d8 et je pointe sur 0xe002e8
je suis 0xe002dc et je pointe sur 0xe00318
destructeur de 0xe002dc (0xe00318)
je suis 0xe002d8 et je pointe sur 0xe00318
destructeur de 0xe002d8 (0xe00318)