我正在使用C++隊列。首先,我進行推送(複製構造函數被調用並正常工作),當我做一個簡單的流行時,它調用第一個析構函數方法(而不是新創建的)。這裏,示例代碼:std ::隊列錯誤?彈出調用錯誤破壞函數
{
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;
}
}
......
......
......
}
你如何確定析構函數調用哪個對象? 'T_MENSAJE'究竟是什麼?你能發佈一個完整的測試用例來證明這個bug嗎? –
是的,你怎麼確定?聽起來像實例2的析構函數在'.pop()' – Salgar
處調用。在「實例1」上調用兩次析構函數聽起來就像會產生一個令人討厭的錯誤,尤其是在調試模式下。這表明你的結論可能不正確。 – Rook