Salut à tous,
J’ai une principale List de pointeur à objets qui est la liste principale.
A chaque fois un objet est injecté dans cette liste je dois chercher dans une liste secondaire, de pointeur à objets,
et suivant les attributs de l’objet injecté et suivant son type il est soit supprimé soit déplacé dans la deuxième List.
Voici une version simplifié de mon code :

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
 
 
list<RequestMsg*>::iterator iter;
 
    for (iter = WBRequests.begin(); iter != WBRequests.end() ; ) {
 
    if (!ServedRequests.empty()){
 
    list<RequestMsg*>::iterator iter2;
 
    for (iter2 = ServedRequests.begin(); iter2 != ServedRequests.end(); ) {
 
 
    if (  condition sure les attributs de l'objet )
 
 
    {
    break;
 
    }
    }
 
    if (iter2 != ServedRequests.end()) // si l'objet est trouvé  
    {
 
    delete *iter2;   // supprimer l'iltérateur
    iter2 = ServedRequests.erase(iter2);
 
    }
 
    else {
 
   opp_error("ERROR   ");
 
    }
 
    list<RequestMsg*>::iterator iter4;
 
    for (iter4 = ServedRequests.begin(); iter4 != ServedRequests.end(); iter4++  ) {
 
 
    if (  condition sure les attributs  de l'objet )
 
    {
    break;
 
    }
 
  }
 
    if (  iter4 != ServedRequests.end()) // objet trouvé
    {
 
        (*iter4)->setIsPSok(true); // modifier un des attributs 
    isPShere= true;
 
     //   iter4++;  //incrémentez ou supprimez ?
 
 
    }
 
    else {
 
 
    delete *iter;  // plus besoin de l'objet 
    iter = WBRequests.erase(iter);
 
    iter4++;  //incrémenté ou supprimé ?
 
    isPShere= false;
 
    }
 
    if (isPShere){ 
 
 
                    list<RequestMsg*>::iterator iter5;
 
    for (iter5 = ServedRequests.begin(); iter5 != ServedRequests.end(); iter5++  ) {
 
    if (  condition sure les attribues de l'objet) // erreur: cette condition n'est jamais franchi  
 
                 {
 
                 break;
 
                 }
 
                 }
 
                  if (iterSer5 != ServedRequests.end())
                           {
 
                     delete *iterSer5;
 
                   //  iterSer5 = ServedRequests.erase(iterSer5);
                     iterSer5++;
                     delete *iter;
 
                     iter  = WBRequests.erase(iter );
 
                     isPShere= false;
 
                             }
 
                         else {
                                      delete *iter5;
                 //   iter5= ServedRequests.erase(iter5);
                                      iter5++;
                             delete *iter;
                              iter  = WBRequests.erase(iter );
 
                             isPShere= false;
 
                          }
                         }
                   }
               }
D'après la documentation de OMNET++ l'erreur que je reçois est

( invalid pointer access, the object the pointer is pointing to is deleted.) Ligne 81 .

Ma question est c'est quoi la différence entre delete *iter et iter = WBRequests.erase(iter ) ?

Pour le moment j'utilise les 2 en même temps quand j'ai plus besoin de l'objet, je le supprime et l’incrémentation se fait automatiquement.