Excelent. Have managed to trim down MOST of the memory leaks down. Handy tool for certain. Still few issues. I'll try to put all relevant code here. I bold the lines where error comes up.
==12877== Conditional jump or move depends on uninitialised value(s)
==12877== at 0x4026190: index (mc_replace_strmem.c:160)
==12877== by 0x804F5D5: player::readNetwork(char*) (player.cpp:54)
==12877== by 0x8057625: server::listen() (serverListen.cpp:172)
==12877== by 0x804FFD9: server::start() (server.cpp:211)
==12877== by 0x804D222: main (mainserver.cpp:10)
Code:
int player::readNetwork(char *answer) {
int result;
int bytesRcvd = 0;
if(SDLNet_CheckSockets(mySet, 1)>0) {
if(SDLNet_SocketReady(mySocket)!=0) {
do {
result=SDLNet_TCP_Recv(mySocket, answer+bytesRcvd, 1);
if(result==0) {
SDLNet_TCP_DelSocket(mySet,mySocket);
SDLNet_TCP_Close(mySocket);
return 0;
}
bytesRcvd+=result;
} while(!strchr(answer, '\n') );
//printf("Answer is: %s\n", answer);
}
return result;
}
return -1;
}
Code:
int server::listen() {
for (int i=0;i<clientsConnected; i++) {
buf=new char[MAX_PACKET_SIZE];
buf[0]=' '; // this was just desperate attempt if this would mean it's initialised. Also tried strcpy(buf, " ");
if(playerList[i]->readNetwork(buf)>0) {
for(int j=0;j<messages.size();j++) {
delete[] messages[j];
}
messages.clear();
buf=strtok(buf, "*");
printf("%s\n", buf);
while(buf!=NULL) {
messages.push_back(buf);
buf=strtok(NULL, "*");
}
for(int j=0;j<messages.size();j++) {
resolvePlayerMessages(messages[j], i);
}
}
delete[] buf;
}
Second error:
==12877== Use of uninitialised value of size 4
==12877== at 0x4342FE9: strtok (in /lib/tls/i686/cmov/libc-2.8.90.so)
==12877== by 0x804FFD9: server::start() (server.cpp:211)
==12877== by 0x804D222: main (mainserver.cpp:10)
And:
==12877== Conditional jump or move depends on uninitialised value(s)
==12877== at 0x4342FEC: strtok (in /lib/tls/i686/cmov/libc-2.8.90.so)
==12877== by 0x804FFD9: server::start() (server.cpp:211)
==12877== by 0x804D222: main (mainserver.cpp:10)
Both in following code:
Code:
void server::start() {
running=true;
printf("hep!!!\n");
while(running) {
listen();
mainAction();
//replyToClients();
}
}
And then last few memory leaks. This one repeats twice.
==12877== at 0x4025D2E: malloc (vg_replace_malloc.c:207)
==12877== by 0x41A6510: SDLNet_AllocSocketSet (in /usr/lib/libSDL_net-1.2.so.0.0.7)
==12877== by 0x804F897: player::player() (player.cpp:13)
==12877== by 0x8057442: server::listen() (serverListen.cpp:151)
==12877== by 0x804FFD9: server::start() (server.cpp:211)
==12877== by 0x804D222: main (mainserver.cpp:10)
Code:
player::player() {
name=new char[256];
userName=new char[256];
nextMessage=new char[MAX_PACKET_SIZE];
strcpy(nextMessage, "");
mySet = SDLNet_AllocSocketSet(1);
}
However mySet IS freed in destructor. Surely it would complain same about name etc if somewhere players destructor isn't called ever? Might this be fault in SDL_Net instead?
Code:
int server::listen() {
char *buf;
vector<char*> messages;
playerList.push_back(new player());
if(playerList[clientsConnected]->addSocket(SDLNet_TCP_Accept(readSocket))) {
if(clientsConnected<MAX_CONNECTIONS) {
printf("Connection established!\n");
clientsConnected++;
} else {
char buf[5];
sprintf(buf, "%i", GNOCONNECTIONSAVAILABLE);
playerList[clientsConnected]->addMessage(buf);
delete playerList[clientsConnected];
playerList.pop_back();
}
} else {
delete playerList[clientsConnected];
playerList.pop_back();
//playerList.erase(playerList.begin()+clientsConnected);
}
And this repeats twice:
==12877== 350 bytes in 1 blocks are possibly lost in loss record 3 of 4
==12877== at 0x402505E: operator new[](unsigned) (vg_replace_malloc.c:268)
==12877== by 0x80575F6: server::listen() (serverListen.cpp:170)
==12877== by 0x804FFD9: server::start() (server.cpp:211)
==12877== by 0x804D222: main (mainserver.cpp:10)
Code:
for (int i=0;i<clientsConnected; i++) {
buf=new char[MAX_PACKET_SIZE];
buf[0]=' ';
if(playerList[i]->readNetwork(buf)>0) {
for(int j=0;j<messages.size();j++) {
delete[] messages[j];
}
messages.clear();
buf=strtok(buf, "*");
printf("%s\n", buf);
while(buf!=NULL) {
messages.push_back(buf);
buf=strtok(NULL, "*");
}
for(int j=0;j<messages.size();j++) {
resolvePlayerMessages(messages[j], i);
}
}
delete[] buf;
}
I think that's pretty much all code relevant there. Some variable definitions:
Code:
//player.h
TCPsocket mySocket;
SDLNet_SocketSet mySet;
char *nextMessage;
char *name;
char *userName;
However there's been DEFINETLY "some" improvement. Seems code was one heck of a memory leaker before. Now about 1.5kb lost. Not that bad though about 1.5kb too much. Atleast I shoudln't run out of memory while testing and debugging!
Bookmarks