strcore.cpp(118) : {576} normal block at 0x003454F8, 30 bytes long.
Data: <                > 02 00 00 00 11 00 00 00 11 00 00 00 D5 FD D4 DA 
strcore.cpp(118) : {105} normal block at 0x00345CC0, 78 bytes long.
Data: <    &   A       > 01 00 00 00 26 00 00 00 41 00 00 00 B7 FE CE F1 
{100} normal block at 0x00345960, 240 bytes long.
Data: <P           L   > 50 0B 00 00 E4 0A 00 00 00 00 CD CD 4C 0B 00 00 
strcore.cpp(118) : {99} normal block at 0x003458F8, 40 bytes long.
Data: <            E:\O> 01 00 00 00 1B 00 00 00 1B 00 00 00 45 3A 5C 4F 
strcore.cpp(118) : {82} normal block at 0x00345230, 20 bytes long.
Data: <            0.0.> 01 00 00 00 07 00 00 00 07 00 00 00 30 2E 30 2E 
{81} normal block at 0x003451C8, 33 bytes long.
Data: < E:\Online_Updat> 00 45 3A 5C 4F 6E 6C 69 6E 65 5F 55 70 64 61 74 
strcore.cpp(118) : {80} normal block at 0x00345160, 40 bytes long.
Data: <            E:\O> 01 00 00 00 1B 00 00 00 1B 00 00 00 45 3A 5C 4F 
strcore.cpp(118) : {79} normal block at 0x003450D8, 62 bytes long.
Data: <    1   1   "E:\> 01 00 00 00 31 00 00 00 31 00 00 00 22 45 3A 5C另外,我装了Purify, rose2003的,奇怪的是,每次使用都不起作用!:(
建立一个控制台应用程序,竟然不报内存泄漏!!!
void main()
{
int *pInt = new int;
}大家评论一下。

解决方案 »

  1.   

    E:\Online_Updat
    从特征数据上追察30 bytes long, 240 bytes long
    从字节数上找
      

  2.   

    小猪,只有Win32工程才能报,是吗?BoundsChecker也是这样。而且一个空的MFC工程,两个工具都会报内存泄漏!
    看来MFC不适合继续开发下去了。
      

  3.   

    MFC报内存泄漏是MFC库实现的,而在控制台程序里没有调用MFC库,所以没有报内存泄漏。实际上这时内存已经泄漏了,只是没有报出来。
      

  4.   

    根据你debug窗口输的信息看来,是CString类的对象没有释放。
    1、你new了CString类对象,而没有delete它。
    2、你的某个类里面有CString类的数据成员,你new了这个类的对象但没有delete。
      

  5.   

    学习, 知道了 Purify 是干什么的!  rose2003如何CRACK.
      

  6.   

    发现问题了!DWORD WINAPI CTCPServerSession::MainServerProc(LPVOID pParam)
    {
    CString strTipInfo;
    CTCPServerSession *self = (CTCPServerSession *)pParam; strTipInfo.Format("服务器启动成功, 正在监听 %d 端口...", self->m_nServerPort);
    self->m_pLink->OnServerMessage(strTipInfo); while(1)
    {
    sockaddr_in addrClient;
    int iAddrSize = sizeof(addrClient); SOCKET socketClient = accept(self->m_socketServer, (struct sockaddr *)&addrClient, &iAddrSize);
    if(socketClient == SOCKET_ERROR) 
    {
    char szErrorInfo[128];
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), NULL, szErrorInfo, 100, NULL);
    TRACE("CTCPServerSession::MainServerProc : %s \n", szErrorInfo);
    break;
    } char szClientIP[32] = {0};
    sprintf(szClientIP, "%d.%d.%d.%d", addrClient.sin_addr.S_un.S_un_b.s_b1, 
    addrClient.sin_addr.S_un.S_un_b.s_b2,
    addrClient.sin_addr.S_un.S_un_b.s_b3,
    addrClient.sin_addr.S_un.S_un_b.s_b4); strTipInfo.Format("%s连接到服务器...\n", szClientIP);
    self->m_pLink->OnServerCurrentStatus(strTipInfo); FILE_TRANSFER_SEND_INFO FTSI;
    FTSI.socket = socketClient;
    FTSI.hEvent = NULL;
    FTSI.dwMaxSpeed = self->m_dwMaxSpeed;
    FTSI.strServerRootDir = self->m_strServerRootDir;
    strcpy(FTSI.szClientIP, szClientIP);
    ASSERT(self->m_pLink != NULL);
    FTSI.pLink = (LPVOID)self->m_pLink;

    CFileTransferWorker *pFileTransferWorker = new CFileTransferWorker(FTSI);
    self->m_threadpool.ProcessJob(pFileTransferWorker); } return 0;
    }其中的 while循环没有中断机制,大家一般采取什么办法来中断while循环?
    服务器很可能在accept这里停住了啊。
      

  7.   

    唉,内存泄漏就是很麻烦,有new的地方还好找,要不真头疼
    中止while可以CreateEevet()一个事件放在while(1)里等待,
    等要退出的时候SetEvent()好了
      

  8.   

    线程函数必须正常退出才能释放申请的内存或者资源,如果采用强制退出如:::TerminateThread(pCCommThread->m_hThread, ExitCode);就会产生泄漏。
    你可以在退出线程处设置一个信号量
    ::WaitForSingleObject(pCCommThread->CommOpenSemaphore(), 10000);
    在线程函数退出处释放信号量。这样就可以正常退出。
    必须注意的是,在线程函数中如果与主窗体有交互的话,可能会导致阻塞。比如在线程中有SendMessage函数
    在程序关闭的时候线程如果还在发送消息,这样就会阻塞。