[英]In C++, passing a pointer still copies the object?
我已經閱讀了一個小時,但仍然不了解我的應用程序正在發生什么。 由於我使用帶有new
和delete
的對象實例,因此我需要自己管理內存。 我的應用程序需要長時間運行,因此正確管理內存消耗對我來說至關重要。
這是我用來轉儲數據包的靜態函數,該數據包在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!
有人可以闡明我每次從一個塊傳遞到另一個塊時引用為何不同的原因嗎? 這對內存消耗意味着什么? 如何確定我沒有復制內存? 謝謝。
可變字節是指向數據的指針,即數據的存儲位置。 但這不是您要打印的內容,而是要打印出該指針所在的地址,即指針所傳遞的堆棧上的地址。 所以
printf(" |---DUMPING DATAPACKET refId: %d ....\n", &bytes);
應該只是
printf(" |---DUMPING DATAPACKET refId: %d ....\n", bytes);
bytes變量是dumpBytes中的一個函數參數,在本例中為指針,您會從傳遞的指針中復制一個新指針,但它仍然是一個新指針,在堆棧中有自己的地址 ,因此取其地址將每次都不同,除非它是從同一位置調用的,並且堆棧地址由於純巧合而導致相同。
在對dumpBytes的調用中,您使用了傳遞副本而不是傳遞引用來傳遞字節。
to BYTES being created for the lifetime of the dumpBytes. 這將導致在dumpBytes的生存期內創建 BYTES的新 。 根據您的系統,這將是8,16,32,64字節等。換句話說,除非您有非常嚴格的內存限制,否則這不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.