我已经阅读了一个小时,但仍然不了解我的应用程序正在发生什么。
由于我使用的对象实例带有newdelete,因此我需要自己管理内存。我的应用程序需要长时间运行,因此正确管理内存消耗对我来说至关重要。

这是我用来转储数据包的静态函数,该数据包在PC和I / O板之间双向传输。数据包是BYTE的数组,并封装到DCCmdDCReply(都是抽象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);

关于c++ - 在C++中,传递指针仍会复制对象吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1459001/

10-12 12:25
查看更多