저는 한 시간 전에 책을 읽었으며 아직도 내 응용 프로그램에서 무슨 일이 일어나는지 알지 못합니다. new
및 delete
과 함께 객체의 인스턴스를 사용하고 있으므로 메모리를 직접 관리해야합니다. 내 애플리케이션은 오랜 시간 동안 작동해야하므로 메모리 소비를 적절하게 관리하는 것이 중요합니다.C++에서 포인터를 전달해도 여전히 개체가 복사됩니까?
다음은 데이터 패킷을 덤프하는 데 사용하는 정적 기능입니다.이 기능은 PC와 I/O 보드간에 양방향으로 전송됩니다. 데이터 패킷은 BYTE
의 배열이며 DCCmd
또는 DCReply
(모두 DCMessage
추상 클래스 구현) 객체로 캡슐화됩니다.
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);
}
그런 다음이 사용하는 경우가있다 : 나는 DCCmd
객체를 생성하고 전송하기 위해 보내는 메시지 큐에 추가합니다. "펌프"(무한 루프)는 보낼 편지함을 검사하고 임의의 후보를 IOConnector
싱글 톤 개체로 전달합니다.
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);
... 큐에 추가 :
bool DC::sendMsg(DCMessage* msg)
{
if(isOnline()){
outbox->add(msg);
return true;
} else {
return false;
}
}
큐에 추가가 커넥터 클래스에서 (void add(DCMessage* msg);
이루어집니다 정말 무엇을보고 그 dumpBytes()
의 다른있다 전송 예정)
출력은 다음과 같습니다.
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!
누군가가 한 블록에서 다른 블록으로 전달할 때마다 참조가 다른 이유는 무엇입니까? 이것은 메모리 소비의 의미는 무엇입니까? 내가 메모리를 복제하지 않도록하려면 어떻게해야합니까? 감사.
사실,이 배열의 동일한 복사본으로 작업하고 있는지 여부를 확인한이 모든 상황을 수정하면 응용 프로그램 전체에서 동일한 주소가 출력됩니다. 포인터는 의도 한대로 실제로 작동합니다. –