在C ++中,传递指针仍然复制对象?

时间:2009-09-22 09:18:23

标签: c++ reference pointers

我现在已经阅读了一个小时,但仍然无法了解我的应用程序。 由于我使用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对象并将其添加到要发送的传出消息队列中。 “pump”(无限循环)检查发件箱并将任何候选者传递给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!

有人可以说清楚为什么每次从一个街区到另一个街区时参考文献都不同?这对内存消耗意味着什么?我怎样才能确保我没有重复内存?感谢。

3 个答案:

答案 0 :(得分:5)

变量字节是指向数据的指针,即数据的存储位置。 但这不是您要打印的内容,而是打印出该指针所在的地址,即指针传递的堆栈上的地址。所以

printf("       |---DUMPING DATAPACKET refId: %d ....\n", &bytes);

应该只是

printf("       |---DUMPING DATAPACKET refId: %d ....\n", bytes);

答案 1 :(得分:1)

bytes 变量是dumpBytes中的一个函数参数,在本例中是一个指针,你从传递的指针中获取一个新的指针,但它仍然是一个新的,与他的在堆栈中拥有自己的地址,所以取其地址每次都会有所不同,除非从同一个地方调用它,并且堆栈地址通过纯粹的巧合产生相同的结果。 / p>

答案 2 :(得分:1)

在对dumpBytes的调用中,您使用pass-by-copy而不是pass-by-reference传递字节。

这会导致在dumpBytes的生命周期内为BYTES创建一个新的指针。根据你的系统,这将是8,16,32,64字节等。换句话说,除非你有真正的,非常严格的内存限制,否则它不是问题。