Bonjour,
Je travaille actuellement sur un projet d'optimisation en C++. Mon code compile, mais ne tourne pas car il rencontre un segfault.
Voilà comment ca se passe. J'ai (entre autres) des clients et des requetes. Chaque client peut avoir plusieurs requetes, et chaque requete provient d'un seul client.
Dans la classe Request, j'ai donc un membre qui est un pointeur vers Client, et dans Client, un vector de pointeurs vers Request. Tout ca evidemment avec des forward-declaration pour que ca compile.
Maintenant le hic: quand j'importe mon fichier de conf, je cree un Client, puis les Request qui vont avec. J'appelle le constructeur de Client avec new, et je mets le pointeur dans un vector. Puis je boucle sur tous les Request, en appelant le constructeur de Request avec new et en ajoutant le pointeur dans un vecteur. Puis j'appelle la methode add_request de client, qui prend un pointeur vers Request, et l'ajoute dans le vector de Client, suivi de la methode add_client de Request, qui prend un pointeur vers Client et met a jour son membre correspondant. Et là, pour verifier, je regarde si l'id du client du dernier Request du vecteur de Request est egal à l'id du Client en cours (en principe j'aurais pu comparer les pointeurs, mais bon). Et j'ai un segfault sur l'accès au Client dans le Request. Valgrind me dit que la memoire n'est pas allouée.
Je mets le code correspondant en dessous, il y a peut-etre une erreur completement bete (c'est meme quasi sur)
Voilà, je crois que tout y est. Valgrind me dit que c'est lors de l'appel de get_client() que ca foire.
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 using namespace std; class Request; class Client { private: int _id; vector<Request*> _requests; public: Client(); Client(int id) : _id(id) {} ~Client(); void add_request(Request* r); int get_id() {return _id;} vector<Request*>& get_requests() {return _requests;} }; void Client::add_request(Request* r) { _requests.push_back(r); } using namespace std; class Client; class Request { private: Client* _client; public: Request(); Request(double early, double late, double s_time, double r_time, int skill, int day); ~Request(); Client* get_client() { return _client;} void add_client(Client* cli); }; void Request::add_client(Client* cli) { _client = cli; } /******* debut code en question *******/ vector<Client*> clientVec; vector<Request*> requestVec; for (unsigned int i=0; i<_coords.size(); i++) { Client* tmpClient = new Client(i+1); clientVec.push_back(tmpClient); for (int j=0; j<_num_days;j++) { /* * creation des valeurs de la requete */ /*creation de la requete */ Request* tmpRequest = new Request(early,late,s_time,r_time,skill,j); /* on ajoute les pointeurs */ tmpClient->add_request(tmpRequest); tmpRequest->add_client(tmpClient); /* on ajoute la requete au vecteur */ requestVec.push_back(tmpRequest); assert ( (*requestVec.end())->get_client()->get_id()==tmpClient->get_id() ) /*ICI se trouve le segfault */ } } /******* fin code en question *******/
Honnetement je suis assez mystifié. Je suis persuadé de louper un truc, mais je ne sais pas quoi.
Si vous avez des pistes, je suis donc preneur!
Merci d'avance!
Partager