std::vector, méthode push_back() et back() erreur imcompréhensible !
Bonjour,
Voici bientôt 2 heures que je bute sur la même erreur, voici le bout de code en question:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
// Ici une méthode static de Server appelé par un thread
// data est une référence vers ma classe Server
void* Server::loopISA(void* data){
Server* _this = reinterpret_cast<Server*>(data);
while(true) {
// Je parcours une liste de client
vector<struct Client>::iterator it;
for (it = lsClient.begin(); it!=lsClient.end ();++it) {
// Je créér une instance d'une Classe MessageTimer
MessageTimer mISA(Message(Message::ISA,"Are you alive?"));
mISA.setReceiver(it->sin);
mISA.send(_this->_sockfd); //Message bien envoyé et recu à l'addresse it->sin
// lsSendBackMsg est un attribut de ma classe Server: vector<MessageTimer> lsSendBackMsg;
_this->lsSendBackMsg.push_back(mISA);
cout << "port:" << ntohs(_this->lsSendBackMsg.back().getReceiver().sin_port) << "=?=" << ntohs(mISA.getReceiver().sin_port) << endl;
cout << "type:" << _this->lsSendBackMsg.back().getType() << "=?=" << mISA.getType() << endl; |
Mon Objet mISA s'affiche parfaitement bien: mISA.getReceiver().sin_port et mISA.getType() retourne bien ce qu'il faut, en revanche une fois inséré dans ma liste avec lsSendBackMsg.push_back(mISA); l'objet lsSendBackMsg.back() me retourne n'importe quoi:
Voici un éxemple d'éxécution: (aucune erreur/warning à la compilation)
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
|
// port=40765 et type=13 attendu
port:0=?=40765
type:13=?=13
port:0=?=40765
type:13=?=13
port:0=?=40765
type:13=?=13
port:52489=?=40765
type:13=?=13
port:52489=?=40765
type:13=?=13
port:52489=?=40765
type:13=?=13
port:0=?=40765
type:13=?=13
port:0=?=40765
type:13=?=13
port:0=?=40765
type:13=?=13
port:0=?=40765
type:13=?=13 |
Je précise qu'il n'y a aucun autre thread lancé en concurrence, il n'y a que ce thread qui modifie et parcours cette liste pendant l'éxécution de mon programme...
Merci de votre aide,
@J'ajoute le code des classes MessageTimer et Message (ne sait-on jamais...)
Je n'ai laissé que les méthodes utilisées.
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 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
|
#ifndef _Message_hh
#define _Message_hh
#include <vector>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <sstream>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdarg.h>
#include <string.h>
#define CONTENT_SIZE 510
using namespace std;
class Message {
private:
int _type;
char _c_content[CONTENT_SIZE];
int _c_offset;
struct sockaddr_in sender;
struct sockaddr_in receiver;
//Construction par buffer
public:
//Construction par type + content
Message(int type=0,const string& content=""){
_type=type;
strcpy(_c_content,content.c_str());
_c_offset=content.length();
}
//Construction par copie
Message(const Message& msg){
*this=msg;
}
Message& operator=(const Message& msg){
for(int i=0;i<(int)msg._c_offset;i++)
_c_content[i]=msg._c_content[i];
_c_offset=msg._c_offset;
_type=msg._type;
return *this;
}
// Envoie le message au receiver
void send(int sockWrite){
// un sendto() ....
}
//Getter & Setter
public:
//getter,setter Adresse recepteur
void setReceiver(const sockaddr_in &sin){
receiver=sin;
}
const sockaddr_in& getReceiver() const {
return receiver;
}
const int getType() const{
return _type;
}
};
#endif |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
#ifndef _MessageTimer_hh
#define _MessageTimer_hh
#include "Message.hh"
#include <time.h>
class MessageTimer: public Message {
private:
time_t _time;
int _nbSendBack;
public:
// Construction d'un messageTimer
MessageTimer(const Message& msg,const int nbSendBack=0): Message(msg) {
_time=time(NULL);
_nbSendBack=nbSendBack;
}
};
#endif |