用完成端口做一个通讯程序,在主线程中定时发送WsaSend命令,
在完成端口线程中接收数据WsaRecv。
问题是:
在发送WsaSend命令前,要分配LPPER_IO_DATA内存,现在是不知道在什么
地方释放分配的内存。
void CSHBiao::SendCmd()
{
char elbCmd = 0xe3;
char biaoCmd = 0xee;
charARRAY cmd;
long nCmdLen;
int nRet;
CCommand *pCmd = NULL;
pCmd = BuildCmd(cmd, &elbCmd, 1, &biaoCmd, 1);
if(!pCmd)
{
nRet = -1;
}
DWORD dwByteSend;
LPPER_IO_DATA lpPerIoData = (LPPER_IO_DATA) new char[sizeof(PER_IO_DATA)];
ZeroMemory(lpPerIoData, sizeof(PER_IO_DATA));
nCmdLen = cmd.size();
cmd.push_back('\0'); //[nCmdLen] = '\0';
memcpy(lpPerIoData->Buffer, &cmd[0], nCmdLen);
lpPerIoData->WSABuf.buf = lpPerIoData->Buffer;
lpPerIoData->WSABuf.len = nCmdLen;
lpPerIoData->nSendBytes = 0;
lpPerIoData->nTotalBytes = nCmdLen;
lpPerIoData->hSocket = m_socket;
nRet = WSASend(m_socket, &lpPerIoData->WSABuf, 1, &dwByteSend, 0,
&(lpPerIoData->Overlapped), NULL);
CTime stTime;
stTime = CTime::GetCurrentTime();
if(nRet == 0)
{
//把命令加入列表
AddCmdToList(pCmd);
}
else
{
if(WSAGetLastError() == WSA_IO_PENDING)
{
int i=0;
}
else
{
}
}
delete lpPerIoData; -----这一行出错,把lpPerIoData释放,
-----命令就没法发送。
-----不释放,命令发送成功,但内存泄漏
}
在完成端口线程中接收数据WsaRecv。
问题是:
在发送WsaSend命令前,要分配LPPER_IO_DATA内存,现在是不知道在什么
地方释放分配的内存。
void CSHBiao::SendCmd()
{
char elbCmd = 0xe3;
char biaoCmd = 0xee;
charARRAY cmd;
long nCmdLen;
int nRet;
CCommand *pCmd = NULL;
pCmd = BuildCmd(cmd, &elbCmd, 1, &biaoCmd, 1);
if(!pCmd)
{
nRet = -1;
}
DWORD dwByteSend;
LPPER_IO_DATA lpPerIoData = (LPPER_IO_DATA) new char[sizeof(PER_IO_DATA)];
ZeroMemory(lpPerIoData, sizeof(PER_IO_DATA));
nCmdLen = cmd.size();
cmd.push_back('\0'); //[nCmdLen] = '\0';
memcpy(lpPerIoData->Buffer, &cmd[0], nCmdLen);
lpPerIoData->WSABuf.buf = lpPerIoData->Buffer;
lpPerIoData->WSABuf.len = nCmdLen;
lpPerIoData->nSendBytes = 0;
lpPerIoData->nTotalBytes = nCmdLen;
lpPerIoData->hSocket = m_socket;
nRet = WSASend(m_socket, &lpPerIoData->WSABuf, 1, &dwByteSend, 0,
&(lpPerIoData->Overlapped), NULL);
CTime stTime;
stTime = CTime::GetCurrentTime();
if(nRet == 0)
{
//把命令加入列表
AddCmdToList(pCmd);
}
else
{
if(WSAGetLastError() == WSA_IO_PENDING)
{
int i=0;
}
else
{
}
}
delete lpPerIoData; -----这一行出错,把lpPerIoData释放,
-----命令就没法发送。
-----不释放,命令发送成功,但内存泄漏
}
解决方案 »
- CreateMemoryResourceNotification()没能捕捉到内存耗尽的事件,为什么?
- mfc调用com组件的问题
- 高分请教:图片处理问题
- 回帖真的是一种美德吗?
- 请教关于钩子回放WH_JOURNALPLAYBACK
- ON_EN_CHANGE属于什么消息?
- 请问如何实现这样的密码窗口????INI文件读写问题?
- 在ListCtrl中用右键弹出菜单,怎么只能弹出一次,第二次就失败了?
- 请教高手:在套接字IO模型WSAAsyncSelect()中如何处理send()的WSAEWOULDBLOCK错误!!!
- 紧急:使用CIPAddressCtrl::GetAddress
- 这个该怎么办
- 每 5000 次的读数据库循环,我是用 1 个线程去读,还是分配到多个线程例如 5 个线程去读,获得数据的整体效率那个高?
delete lpPerIoData后没有内存泄漏,不知道
这样正确不正确?
malloc--->free
new---delete
new[]-->delet[]
delete lpPerIoData后没有内存泄漏,不知道
这样正确不正确?如果没有发送成功呢??怎么处理
&(lpPerIoData->Overlapped), NULL);传递的都是地址,当你释放lpPerIoData时这些地址都释放了,当然会报错。有一个办法就是将lpPerIoData设置为全局变量或设置为参数的形式。
我知道会错误,才问你们如何解决?我想知道解决的方法。谢谢各位大侠。