2014-05-14 34 views
0

我正在使用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; 
     } 

    } 

...... 
...... 
...... 
} 
+0

你如何確定析構函數調用哪個對象? 'T_MENSAJE'究竟是什麼?你能發佈一個完整的測試用例來證明這個bug嗎? –

+0

是的,你怎麼確定?聽起來像實例2的析構函數在'.pop()' – Salgar

+1

處調用。在「實例1」上調用兩次析構函數聽起來就像會產生一個令人討厭的錯誤,尤其是在調試模式下。這表明你的結論可能不正確。 – Rook

回答

4

&m.m_data到您的會員M_DATA的地址的地址的memcpy memcpy((char*)&(m_data),&m.m_data, numBytes);副本numBytes。這是錯誤的,並覆蓋你的對象的一部分。

+0

哦,我的好人!非常感謝你!!! :)我感覺作爲一個愚蠢noob小時後尋找解決方案..... 再次感謝! – jromeror