一个封包的接收程序每次点击listctrl控件上的一条记录,会在editbox显示出封包的16进制数据,我采用了网上下载的16进制edit类.
void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
    //单击LISTCTRL得到当前所选项的索引值 
    int nCulSelIndex = pNMListView->iItem; 
    if(nCulSelIndex == -1)
return;
    
     CString Packet = m_list.GetItemText(nCulSelIndex,2);//获取数据
      int len = Packet.GetLength();//长度
      char *cPacket = Packet.GetBuffer(len);
     Packet.ReleaseBuffer();
     unsigned char *uPacket = (unsigned char*)malloc(len);
     memcpy(uPacket,cPacket,len);      m_edit.m_length = len;
      m_edit.m_pData = uPacket;
      m_edit.RedrawWindow();//重绘
      free(uPacket);//释放问题出来了,点击第一条记录,能够正常显示数据,但是一旦窗口小化或者被遮盖,editbox就要重绘一次,但是显示的数据却不正确了,因为uPacket被释放了.但是如果不free(uPacket)就会造成内存泄露.
有没有什么解决办法,即然动态产生数组,也不会产生内存泄路问题,而且重绘时,也能够正常显示数据.
      

解决方案 »

  1.   

    char *cPacket = Packet.GetBuffer(len); 
    Packet.ReleaseBuffer(); 
    memcpy(uPacket,cPacket,len); 
    这是不正确的,packet 等memcpy之后再释放
      

  2.   

    m_edit.m_pData = malloc*****
    将数据考入m_edit.m_pData
    然后m_edit释放的时候释放m_edit.m_pData
      

  3.   

    为什么要malloc,直接用数组不行?
    貌似数据量不是很大
      

  4.   

    很搞不懂你的代码的意思.CString Packet = m_list.GetItemText(nCulSelIndex,2);//获取数据 
    m_edit.m_length = Packet.GetLength();//长度 
    m_edit.m_pData = Packet ; 
    m_edit.RedrawWindow();//重绘 
      
    代码这样不是更好么?何必要malloc>?估计问题不是出在这里,再好好查下别忙下定论,char *不支持 =号,看你的代码始终还是围绕着CString对象直接赋过去就是了.
      

  5.   

    m_pData要是指针的话上面就错了
    m_edit.m_pData = Packet.GetBuffer(0);
      

  6.   

    别在这里free,把m_edit.m_pData初始化为0,在改变该变量值之前(包括m_edit析构)如果该变量值不是0则free。