请帮小弟我找出接口中的异常导致的内存泄露,纠结好久
请帮我找出接口中的错误导致的内存泄露,纠结好久
首先我声明了这样两个结构体:
主要是下面这个接口中的声明出现了问题。
}
sendp->sendBuf="";
delete sendp;
return NO_RESPONSE; //recv fail
return 0;
}[/code]
欢迎高手解答,不胜感激。
------解决方案--------------------
首先,你程序里面tcpRecvp *recvp;这种指针是临时变量,虽然它指向的内容是从堆分配的,但是它本身却是从栈分配的,你把这样一个变量传入线程函数,是不安全的.
再有就是你结构体中也有指针,你光对结构体变量用delete是不能释放完的.你还得对其内部的指针变量进行释放.也就是你在释放那两个结构体的时候,
sendp->sendBuf="";
recvp->recvBuf="";
delete recvp;
delete sendp;
应该写成
if(sendp && sendp->sendBuf)
{
delete sendp->sendBuf;
sendp->sendBuf=NULL;
delete sendp;
sendp=NULL;
}
if(recvp && recvp->recvBuf)
{
delete recvp->recvBuf;
recvp->recvBuf=NULL;
delete recvp;
recvp=NULL
}
首先我声明了这样两个结构体:
- C/C++ code
typedef struct _TCP_SENDP_ { SOCKET sockSend; //SOCKET用于发送和接受 const int8_t *sendBuf; //SOCKET待发送数据 Uint16_t sendNum; //待发送字符数量 DWORD iSend; //发送成功返回接收数量,否则返回错误 HANDLE recvThread;//待启动的接收线程 }tcpSendp; typedef struct _TCP_RECVP_ { SOCKET sockSend; //SOCKET用于发送和接受 int8_t *recvBuf; //SOCKET接收到的返回数据 Uint16_t recvNum; //欲接收的字符数量 DWORD iRecv; //接收成功返回1 }tcpRecvp;
主要是下面这个接口中的声明出现了问题。
- C/C++ code
DWORD TcpCommun(const int8_t *strIP, const int8_t *sendBuf, int8_t *recvBuf, const Uint16_t sendNum, const Uint16_t recvNum) { DWORD recvBytes = 0; Uint64_t IP = StrToLong(strIP); int16_t i = 127; while( i>=0 && IP != IPSocket[i].IP) i--; if( i<0 ) return NOT_CONNECT; //Do not connected //出在这里,声明了结构体,出现recvBuf是个无效指针的提示 tcpRecvp *recvp; recvp = new tcpRecvp; recvp->recvBuf = recvBuf; recvp->sockSend = IPSocket[i].sockConn; recvp->recvNum = recvNum; recvp->iRecv = 0; HANDLE recvThread; //CREATE_SUSPENDED, send first, then start recv recvThread = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) tcpRecvPacket, &recvp,CREATE_SUSPENDED, NULL); //这里同样出现了一个无效指针,无解 tcpSendp *sendp; sendp = new tcpSendp; sendp->sendBuf = sendBuf; sendp->sockSend = IPSocket[i].sockConn; sendp->sendNum = sendNum; sendp->iSend = 0; sendp->recvThread= recvThread; HANDLE sendThread; sendThread = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) tcpSendPacket, &sendp, 0, NULL); Sleep(200); //time should be dynamic recvBytes = recvp->iRecv; if(WAIT_TIMEOUT == WaitForSingleObject(recvThread,0))//Thread Active { TerminateThread(recvThread, 0); } if(WAIT_TIMEOUT == WaitForSingleObject(sendThread,0))//Thread Active { TerminateThread(sendThread, 0); } CloseHandle( recvThread ); //release resorces CloseHandle( sendThread ); //下面这段,采用了很***的手段想要去释放内存,可还是有泄露,每次4K if ( (sendp->iSend >1) && (recvp->iRecv >1) ) { sendp->sendBuf=""; recvp->recvBuf=""; delete recvp; delete sendp; return recvBytes; //recv success } recvp->recvBuf=""; delete recvp; if( sendp->iSend < 1) { sendp->sendBuf=""; delete sendp; return NOT_CONNECT; [code=C/C++]
}
sendp->sendBuf="";
delete sendp;
return NO_RESPONSE; //recv fail
return 0;
}[/code]
欢迎高手解答,不胜感激。
------解决方案--------------------
首先,你程序里面tcpRecvp *recvp;这种指针是临时变量,虽然它指向的内容是从堆分配的,但是它本身却是从栈分配的,你把这样一个变量传入线程函数,是不安全的.
再有就是你结构体中也有指针,你光对结构体变量用delete是不能释放完的.你还得对其内部的指针变量进行释放.也就是你在释放那两个结构体的时候,
sendp->sendBuf="";
recvp->recvBuf="";
delete recvp;
delete sendp;
应该写成
if(sendp && sendp->sendBuf)
{
delete sendp->sendBuf;
sendp->sendBuf=NULL;
delete sendp;
sendp=NULL;
}
if(recvp && recvp->recvBuf)
{
delete recvp->recvBuf;
recvp->recvBuf=NULL;
delete recvp;
recvp=NULL
}