我正在使用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;
}
}
......
......
......
}
答案 0 :(得分:4)
memcpy memcpy((char*)&(m_data),&m.m_data, numBytes);
将numBytes
的地址从&m.m_data
的地址复制到您的成员m_data的地址。这是错误的并且会覆盖对象的部分内容。