std :: queue bug? pop调用错误的destroy函数

时间:2014-05-14 16:20:23

标签: c++ queue

我正在使用C ++队列。首先,我进行推送(复制构造函数被调用并正常工作),当我做一个简单的弹出时,它调用第一个析构函数方法(而不是新创建的)。这是一个示例代码:

{
    T_MENSAJE new_msg;      // Constructor 1 called -> Instance 1

    new_msg.rellena(msg);

    m_messages.push(new_msg);   // Copy constructor called -> Instance 2

    m_messages.pop();       // Destructor of instance 1 called !!!!!!!

    return;             // again, destructor of instance 1 called
}

编辑:

为了演示它,我将m_data的内存方向显示为rellena(msg);构造函数复制方法和驱逐舰。在rellena中,memDir1,在复制构造函数memDir2中,正如我所期待的那样。但是当我调用pop方法时,驱逐程序方法显示memDir1(不是我预期的memDir2),然后当函数完成时,再次调用驱逐舰并再次显示memDir1。这是T_MENSAJE结构:

typedef struct T_MENSAJE
{
    T_MSG_HEADER m_cab;
    char        m_command[MSG_COMMAND_SIZE];
    char*       m_data;

    T_MENSAJE():m_data(0){
    }

    ~T_MENSAJE()
    {
        static int counter = 0;
        if (m_data != 0)
        {
            printf("%s -- direction = %d\n",__FUNCTION__,m_data);
            delete[](m_data);
        }
    }

    T_MENSAJE(const T_MENSAJE& m)
    {

        m_cab = m.m_cab;
        memcpy(&m_command,&m.m_command,MSG_COMMAND_SIZE);

        if (m.m_data != 0)
        {
            int numBytes = m_cab.m_lenght-MSG_HEADER_SIZE-MSG_COMMAND_SIZE;
            m_data = new char[numBytes];
            printf("%s -- direction = %d\n",__FUNCTION__,m_data);
            memcpy((char*)&(m_data),&m.m_data, numBytes);
        }else
        {
            m_data = 0;
        }

    }

......
......
......
}

1 个答案:

答案 0 :(得分:4)

memcpy memcpy((char*)&(m_data),&m.m_data, numBytes);numBytes的地址从&m.m_data的地址复制到您的成员m_data的地址。这是错误的并且会覆盖对象的部分内容。