一个封包的接收程序每次点击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)就会造成内存泄露.
有没有什么解决办法,即然动态产生数组,也不会产生内存泄路问题,而且重绘时,也能够正常显示数据.
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)就会造成内存泄露.
有没有什么解决办法,即然动态产生数组,也不会产生内存泄路问题,而且重绘时,也能够正常显示数据.
Packet.ReleaseBuffer();
memcpy(uPacket,cPacket,len);
这是不正确的,packet 等memcpy之后再释放
将数据考入m_edit.m_pData
然后m_edit释放的时候释放m_edit.m_pData
貌似数据量不是很大
m_edit.m_length = Packet.GetLength();//长度
m_edit.m_pData = Packet ;
m_edit.RedrawWindow();//重绘
代码这样不是更好么?何必要malloc>?估计问题不是出在这里,再好好查下别忙下定论,char *不支持 =号,看你的代码始终还是围绕着CString对象直接赋过去就是了.
m_edit.m_pData = Packet.GetBuffer(0);