std::队列错误?Pop调用了错误的destroy函数

std::queue bug? pop calls to wrong destroy function

本文关键字:错误 destroy 函数 Pop 队列 std 调用      更新时间:2023-10-16

我正在使用c++队列。首先,我执行push操作(调用复制构造函数并正常工作),当执行简单的pop操作时,它调用第一个析构函数方法(而不是新创建的方法)。下面是一个示例代码:

{
    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 = %dn",__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 = %dn",__FUNCTION__,m_data);
            memcpy((char*)&(m_data),&m.m_data, numBytes);
        }else
        {
            m_data = 0;
        }
    }
......
......
......
}

memcpy memcpy((char*)&(m_data),&m.m_data, numBytes);numBytes&m.m_data的地址复制到成员m_data的地址。