请帮小弟我找出接口中的异常导致的内存泄露,纠结好久

请帮我找出接口中的错误导致的内存泄露,纠结好久
首先我声明了这样两个结构体:
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++]
//send fail
}

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
}