[英]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.