我在做一个socket通信的程序有一个自己定义的消息类
class CMessage  
{
public:
CMessage();
virtual ~CMessage();
int m_nType;
char  m_strText[1024];
int m_iId;
};
当客户端连接后服务器消息发给客户端
void CTestMsgDlg::OnBtnSend() 
{
// TODO: Add your control notification handler code here
UpdateData();
CMessage *pMsg=new CMessage(m_iType,m_strText,m_iId);
int iSize=sizeof(*pMsg);
int iSend=0,nCharSend=0;
while(iSend<iSize)
{
nCharSend=m_socNew->Send((char*)(pMsg+iSend),iSize-iSend);
iSend+=nCharSend;
}
delete pMsg;
}
客户端接收的时候想把它翻译过来
void CTestClientDlg::OnRecive()
{
CMessage *pMsg=new CMessage();
int iSize=sizeof(*pMsg);
int iReceive=0, nCharRecv=0;
while(iReceive<iSize)
{
nCharRecv=m_socClient.Receive((char*)(pMsg+iReceive),iSize-iReceive);
iReceive+=nCharRecv;
}
m_iId=pMsg->m_iId;
m_iType=pMsg->m_nType;
m_strText=pMsg->m_strText;
UpdateData(FALSE);
//delete pMsg;
}
可是我不知道为什么加delete 会内存出错。但如果不加一点也没事,收发数据也很正常 ,为什么啊。new完怎么能不删除呢。为什么在这删除会出错?很不理解

解决方案 »

  1.   

    你把类结构整个填充掉了,当然无法delete, 虚函数表都被你覆盖掉了, 还咋执行析构啊?
    把类改成struct,去掉构造和虚析构函数试试看
      

  2.   

    哈哈,解决了。guxingfeiyu(孤星飞雨) 的回复提示了我。
    class CMessage 
    {
    public:
    CMessage();
    virtual ~CMessage();
    int m_nType;
    char m_strText[1024];
    int m_iId;
    }; 消息类中有个析构函数,
    我觉得应该是这个原因:首先,我是把整个消息对象的内存结构都发送出去,再客户端接受,然后把这个内存结构拷贝给消息对象,而c++对象内存模型将包括一个虚函数表指针,和类成员变量,而我你通过socket传过来的服务端的消息对象的内存结构中的虚函数表指针是针对服务断的那个对象的,现在我覆盖了客户端的这个对象的虚函数的地址值,而我在客户端调用delete函数的时候,将调用服务端虚析构函数,而这必然产生内存访问违例.
      

  3.   

    virtual ~CMessage();非base类不要用vitual destructor <efficetive c++>