打印

wince 内存泄漏??

[复制链接]
3394|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pilieren|  楼主 | 2009-11-2 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
pilieren|  楼主 | 2009-11-2 16:37 | 只看该作者
DWORD CTCPCustom_CE::SocketThreadFunc(PVOID lparam)
{
        CTCPCustom_CE *pSocket;
        //得到CTCPCustom类实例指针
        pSocket = (CTCPCustom_CE*)lparam;
        //定义读事件集合
        fd_set fdRead;  
        int ret;
        TIMEVAL        aTime;
        aTime.tv_sec = 1;
        aTime.tv_usec = 0;
        while (TRUE)
        {
        //收到退出事件,结束线程
                if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
                {
                        break;
                }
                //置空读事件集合
                FD_ZERO(&fdRead);
                //给pSocket设置读事件
                FD_SET(pSocket->m_socket,&fdRead);
                //调用select函数,判断是否有读事件发生
                ret = select(0,&fdRead,NULL,NULL,&aTime);
               
                if (ret == SOCKET_ERROR)
                {
                        //触发错误事件
                        pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,1);
                        //关闭socket
                        closesocket(pSocket->m_socket);
                        break;
                }
               
                if (ret > 0)
                {
                        //判断是否读事件
                        if (FD_ISSET(pSocket->m_socket,&fdRead))
                        {
                                //char recvBuf[1024];
                               
                                char *recvBuf=new char[1024];
                                int recvLen;
                                ZeroMemory(recvBuf,1024);
                                recvLen = recv(pSocket->m_socket,recvBuf, 1024,0);
                                if (recvLen == SOCKET_ERROR)
                                {
                                        int nErrorCode = WSAGetLastError();
                                        //触发与客户端端连接的Socket错误
                                        pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,nErrorCode);
                                        //触发与客户端端连接的Socket关闭事件
                                        pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket);
                                        //关闭socket
                                        closesocket(pSocket->m_socket);
                                        break;

                                }
                                //表示连接已经从容关闭
                                else if (recvLen == 0)
                                {
                                        pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket);
                                        //关闭socket
                                        closesocket(pSocket->m_socket);
                                        break;
                                }
                                else
                                {
                                                                            //触发与客户端端连接的Socket读事件
                    pSocket->m_pTCPServer_CE->OnClientRead(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,recvBuf,recvLen);
                                }
                       
                        delete[] recvBuf;
                        }
                }
        }
        return 0;
}

使用特权

评论回复
板凳
hulan1985| | 2009-11-2 23:13 | 只看该作者
什么意思啊

使用特权

评论回复
地板
pilieren|  楼主 | 2009-11-3 09:43 | 只看该作者
就是说EVC写的在wince下运行的程序,程序在运行中和服务器socket通

讯过程中,程序内存不断增加===〉内存泄漏

使用特权

评论回复
5
pilieren|  楼主 | 2009-11-3 09:46 | 只看该作者
2楼写的是与服务器通讯的socket线程部分。这部分没有看出来内存泄

漏啊??
看各位大虾能否给个查找内存泄漏的思路???-----我查了好久了都

没有查出来到底是那里存在内存泄漏问题。
只要服务器发送socket命令就会发生内存泄漏问题。

使用特权

评论回复
6
BitFu| | 2009-11-3 09:53 | 只看该作者
哈哈,你的
break;
一执行那
delete[] recvBuf;
就得不到执行了,当然泄漏了。

使用特权

评论回复
7
BitFu| | 2009-11-3 09:54 | 只看该作者
break是从while语句退出而不是IF。

使用特权

评论回复
8
pilieren|  楼主 | 2009-11-3 10:24 | 只看该作者
DWORD CTCPCustom_CE::SocketThreadFunc(PVOID lparam)
{
        CTCPCustom_CE *pSocket;
        //得到CTCPCustom类实例指针
        pSocket = (CTCPCustom_CE*)lparam;
        //定义读事件集合
        fd_set fdRead;  
        int ret;
        TIMEVAL        aTime;
        aTime.tv_sec = 1;
        aTime.tv_usec = 0;
        //--------------------------------------
        //移动位置
        char *recvBuf=new char[1024];

        while (TRUE)
        {
        //收到退出事件,结束线程
                if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
                {
                        break;
                }
                //置空读事件集合
                FD_ZERO(&fdRead);
                //给pSocket设置读事件
                FD_SET(pSocket->m_socket,&fdRead);
                //调用select函数,判断是否有读事件发生
                ret = select(0,&fdRead,NULL,NULL,&aTime);
               
                if (ret == SOCKET_ERROR)
                {
                        //触发错误事件
                        pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,1);
                        //关闭socket
                        closesocket(pSocket->m_socket);
                        break;
                }
               
                if (ret > 0)
                {
                        //判断是否读事件
                        if (FD_ISSET(pSocket->m_socket,&fdRead))
                        {
                                //char recvBuf[1024];
                                //20091102防止内存泄漏
                                //char *recvBuf=new char[1024];
                                int recvLen;
                                ZeroMemory(recvBuf,1024);
                                recvLen = recv(pSocket->m_socket,recvBuf, 1024,0);
                                if (recvLen == SOCKET_ERROR)
                                {
                                        int nErrorCode = WSAGetLastError();
                                        //触发与客户端端连接的Socket错误
                                        pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,nErrorCode);
                                        //触发与客户端端连接的Socket关闭事件
                                        pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket);
                                        //关闭socket
                                        closesocket(pSocket->m_socket);
                                        break;

                                }
                                //表示连接已经从容关闭
                                else if (recvLen == 0)
                                {
                                        pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket);
                                        //关闭socket
                                        closesocket(pSocket->m_socket);
                                        break;
                                }
                                else
                                {
                                        //AfxMessageBox(_T("CTCPCustom_CE接受到数据"));
                                    //触发与客户端端连接的Socket读事件
                    pSocket->m_pTCPServer_CE->OnClientRead(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,recvBuf,recvLen);
                                }
                        //20091102防止内存泄漏
                        //delete[] recvBuf;
                        }
                }
        }

        delete[] recvBuf;
        return 0;
}



谢谢 BitFu!


我感觉问题不在这里,我把程序修改为上面的,即在程序中先申请内存

,最后释放,但是运行中(服务器发socket命令),程序内存依然在以

4KB的速度在增加??!!!

使用特权

评论回复
9
BitFu| | 2009-11-3 10:50 | 只看该作者
那就要查其它地方了,其它类成员
觉得你这个线程函数很古怪,一个线程的函数为什么要频繁的退出呢?
恐怕你是在不断的创建线程,然后自动退出线程
似乎不该这么做。

使用特权

评论回复
10
BitFu| | 2009-11-3 10:52 | 只看该作者
如果你的程序正如我上面猜的那样,请查一下类的构造函数
以及静态成员
是不是不断的创建类的新标本。

使用特权

评论回复
11
mohanwei| | 2009-11-3 12:23 | 只看该作者
通信线程一般是启动后就一直存在的,直到程序退出……避免带来额外的开销
缓冲区这种东西最好直接定义一个足够大的数组,访问时自己判断边界条件。

使用特权

评论回复
12
pilieren|  楼主 | 2009-11-3 13:21 | 只看该作者
谢谢 BitFu!
我的通讯线程是一直存在的,并非频繁推出的。
只在发生错误的时候才会关闭socket,其他时候是不会关闭的。

谢谢 mohanwei!
缓冲区我也试过用全局变量分配足够大的缓冲区,但是也存在这种内存

逐步增大==〉内存泄漏的现象。
我检察了所有的内存开销,一直没有查出具体的内存泄漏的地方,只是

在响应服务器的socket命令时,程序内存在一直增加。
注:我的服务器端是不断断开和我下位机的连接的,然后再不断连接上

,连接时会发出socket命令。

使用特权

评论回复
13
mohanwei| | 2009-11-3 14:33 | 只看该作者
本帖最后由 mohanwei 于 2009-11-3 14:40 编辑

刚才没看到5楼已经改了。
直接改成unsigned char recvBuf[1024];退出时也不用delete了。
嵌入式系统尽量少用new,delete这种东西……
如果还有问题,就要看其它代码了。

使用特权

评论回复
14
pilieren|  楼主 | 2009-11-3 15:33 | 只看该作者
谢谢 mohanwei!
但是不用new,delete在响应服务器命令后也存在程序内存增加现象,原

因还在查找中。

谢谢 BitFu!
的确存在“线程的函数为什么要频繁的退出”现象,但是我没有找到“

频繁启动本线程的原因”,在查找中。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

237

帖子

3

粉丝