我这有个业务网关,他从通信网关收TCP包,然后创建业务线程,在业务线程中访问商务中心,并将结果传回通信网关。
  业务网关启动后每接收几个包内存就会增长。我找了很长时间也没找出错。我下载了BoundsChecker 6。01,他提示由内存泄漏与资源泄漏,有很多InitializeCriticalSection失败,OLEPRO32.DLL中有内存泄漏,并且提示int nResponse = dlg.DoModal();由内存泄漏。希望大家给点思路。

解决方案 »

  1.   

    licyme(锥子),这方面我已反复检查了,不应该有问题,并且在通信网关也使用的是同一种方式,没用问题。所有new的地方我都详细查过,也都跟踪过,的确是正确背删除了。
       由谁常用BoundsChecker ,给点思路.
      

  2.   

    此外我这样创建线程    
    m_OperaThread=new COperaThread(RecvPacket,m_ManSendQueue);
        m_OperaThread->m_bAutoDelete = TRUE;
        m_OperaThread->CreateThread(0);
    在线程中
    AfxEndThread(1);
    这样结束,请问是否还需要delete m_OperaThread;
      

  3.   

    会不会是socket没有关闭(调用close)
      

  4.   

    此外我这样创建线程    
    m_OperaThread=new COperaThread(RecvPacket,m_ManSendQueue);
        m_OperaThread->m_bAutoDelete = TRUE;
        m_OperaThread->CreateThread(0);
    在线程中
    AfxEndThread(1);
    这样结束,请问是否还需要delete m_OperaThread
    我调过了,不需要delete m_OperaThread,线程所占空间会被释放
      

  5.   

    AfxEndThread函数的调用有问题,对于多线程程序,业务处理线程应该在线程处理函数结束后正常退出,如果你调用AfxEndThread,相当于人为的强制结束掉了线程,这样将导致你线程中某些对象的析构函数没有执行,这是导致内存泄漏的主要问题
      

  6.   

    我试过了,调用AfxEndThread,线程会正常结束,并调用析构函数
      

  7.   

    我的感觉,一般不要强制结束线程,
    其实能不结束就不结束,让它挂起好了。兄弟,大家都是内存泄漏,看看吧
    http://expert.csdn.net/Expert/topic/1903/1903559.xml?temp=.4787104
      

  8.   

    我使用了
    _CrtMemCheckpoint();
    _CrtMemDifference();  
    _CrtMemDumpAllObjectsSince();
    好像不是堆的分配问题
      

  9.   

    你有BoundsChecker出现提示的地方设断点进行调试
    如果经常运行到断点处,说明没有内存泄漏或基本上没有