I've been reading for an hour now and still don't get what is going on with my application.
Since I am using instances of object with new
and delete
, I need to manage the memory myself. My application needs to have long uptimes and therefore properly managing the memory consumption is very crucial for me.
Here's the static function I use to dump the datapacket, which is transfered between a PC and the I/O board in both directions. The datapacket is an array of BYTE
s and is encapsulated into an object, either DCCmd
or DCReply
(both are implementation of an abstract DCMessage
class).
void DebugTools::dumpBytes(BYTE* bytes, short length)
{
printf(" |---DUMPING DATAPACKET refId: %d ....\n", &bytes);
for(short i=0; i<length; i++){
printf(" | B%d | %.2X\n", i, bytes[i]);
}
printf(" |---END DUMP refId: %d ....\n", &bytes);
}
Then there's this use case: I create a DCCmd
object and add it to the outgoing message queue to be sent. The "pump" (an infinite loop) checks the outbox and passes any candidates to a IOConnector
singleton object.
DCCmd* cmd = new DCCmd(DIG_CMD_SELFTEST_RES);
cmd->add(param);
printf("cmdSelfTest()\n"); //HACK
BYTE* cmda = cmd->getBytes(); //HACK
DebugTools::dumpBytes(cmda, cmd->getLength()); //HACK
sendMsg(cmd);
... and adding to the queue:
bool DC::sendMsg(DCMessage* msg)
{
if(isOnline()){
outbox->add(msg);
return true;
} else {
return false;
}
}
Adding to the queue is done with void add(DCMessage* msg);
(In the connector class there's another of those dumpBytes()
to see what is really going to be sent)
But here's the output:
TESTING MESSAGE QUEUES ....
cmdSelfTest()
|---DUMPING DATAPACKET refId: 2489136 ....
| B0 | C6
| B1 | A1
| B2 | 00
| B3 | 01
| B4 | 10
| B5 | 00
| B6 | 01
| B7 | 78
|---END DUMP refId: 2489136 ....
adding to queue: 2488884
queues: inbox (0), outbox (1)
send: sending candidates....
sending 2489164 ....
>->-> ...
|---DUMPING DATAPACKET refId: 2488704 ....
| B0 | C6
| B1 | A1
| B2 | 00
| B3 | 01
| B4 | 10
| B5 | 00
| B6 | 01
| B7 | 78
|---END DUMP refId: 2488704 ....
Packet sent!
. ((second iteration of the pump))
queues: inbox (0), outbox (1)
send: sending candidates....
sending 2489164 ....
>->-> ...
|---DUMPING DATAPACKET refId: 2488704 ....
| B0 | C6
| B1 | A1
| B2 | 00
| B3 | 01
| B4 | 10
| B5 | 00
| B6 | 01
| B7 | 78
|---END DUMP refId: 2488704 ....
Packet sent!
Can someone please shed some light why the references are different each time I pass from one block to the other? What does this mean to the memory consumption? How can I make sure I am not duplicating memory? Thanks.