我做了一个主程序和几个dll,主程序调用dll,释放dll
从逻辑上我看不出有任何内存泄漏,但是在任务管理器中发现我每次调用dll
内存增长一些,释放dll后,内存释放一些,但是占用的内存大小比调用dll前大
4k或8k或其他。同时我发现,执行程序后到鼠标点机选中程序之间,内存占用也增长4k
不知道为什么?

解决方案 »

  1.   

    应该是dll程序中有内存泄漏现象。
    应该好好看看那里的程序
      

  2.   

    只要沒有邏輯上的leak 那就可以Ignore
      

  3.   

    自己安装个boundscheck 或 purify之类的工具 ,看看就知道了
    至于下载地址,google一下:)
      

  4.   

    任务管理器看不出来有没有内存泄露的吧
    要通过VC的debug看。在程序运行中,程序会加载很多系统的dll,
    任务管理器显示的是总共所占的内存,
    多多少少你看不出来的。
      

  5.   

    在VC里单步执行程序,如果有溢出,最后在Output窗口会显示的,并指出文件和行号
      

  6.   

    (DLL)代码如下:
    #include "pcap.h"
    #include "remote-ext.h"
    #include <MATH.H>
    #include <time.h>short int       pck_data[1500];   
    //extern  "C"  _declspec(dllexport)  short int * _stdcall  packcap(int AdapterID)
    _declspec(dllexport) short int *  packcap(int AdapterID)
    {
             pcap_if_t             *alldevs,*d;    
    pcap_t                *adhandle;
    pcap_pkthdr           *header;                           // Header     
    char                  errbuf[PCAP_ERRBUF_SIZE]; 
             u_char                *pkt_data,recstring[76];           //接收包缓冲区   
    short int             protocol;
             int                   i=0,j=0,re,SampleCNT;
             short int             BuffAry[6][240];               
    double                TempSquare,tempsum;
             unsigned short int    SqrtAry[6]; 
    short int             succeed;                          
    succeed=0;
        pck_data[0]=succeed; 
    if (pcap_findalldevs(&alldevs, errbuf)==-1)   //调用pcap_findalldevs,
             {                                             //接着就释放pcap_freealldevs
    return pck_data;                    //这里会出现这问题
    }
    else
             { 

    for(d=alldevs; d; d=d->next)  i++;
    if(i==0) 
    {  
    pcap_freealldevs(alldevs);
    return pck_data;
    }

    if(AdapterID < 1 || AdapterID > i)
    {
    pcap_freealldevs(alldevs);
    return pck_data;
    }             

    for(d=alldevs, i=0; i< AdapterID-1 ;d=d->next, i++);    

    if(( adhandle = pcap_open(d->name, 
    65536,         
    PCAP_OPENFLAG_PROMISCUOUS,     
    1000,         
    NULL,         
    errbuf         
    )) == NULL)
    {  
    pcap_freealldevs(alldevs);
    return pck_data;

               }    

        SampleCNT=0;
        pcap_freealldevs(alldevs); 
        while((re=pcap_next_ex(adhandle,&header,(const u_char**)&pkt_data))>=0)
    {  
    if(re == 0) 
    {
    succeed=0;
    break;        
    }

    memcpy(recstring,pkt_data,76);
    memcpy(&protocol,(pkt_data+12),2);
    if ((protocol==129)&&(header->len==76))
    {           
    for (i=0;i<6;i++)
    BuffAry[i][SampleCNT]=(pkt_data[52+2*i]<<8)+(pkt_data[53+2*i]); 
    SampleCNT++;     
    }
    if (SampleCNT>=240) 
    {
    succeed=1;
    break;  
    }
    }


    for (i=0;i<6;i++)                
    {
    TempSquare =0; 
    tempsum    =0;  
    for (j=0;j<240;j++)               
    {     
    TempSquare =BuffAry[i][j]*BuffAry[i][j];
    tempsum=tempsum+TempSquare;
    }

    SqrtAry[i]=(unsigned int)sqrt(tempsum/240);    
    }  

    pck_data[0]=succeed;    
    memcpy(&pck_data[1],&SqrtAry[0],2*6);
    memcpy(&pck_data[7],&BuffAry[0][0],2*6*240);       


    pcap_close(adhandle);

    return pck_data;

    }(TEST_DLL)测试代码如下:void CMMMDlg::OnTimer(UINT nIDEvent) //10毫秒触发一次
    {
    // TODO: Add your message handler code here and/or call default
    short int * p;
    int a=1;
    CString m_str,temp; HINSTANCE hInst;
    hInst=LoadLibrary("W_PCAP.dll");
    typedef short int *  (*p_packcap)(int k);
    p_packcap Packcap=(p_packcap)GetProcAddress(hInst,"packcap"); p=Packcap(a);
    for(int i=0;i<1000;i++)
    {
    m_str.Format("%d",*(p+i));
    temp+=m_str;
    }
    FreeLibrary(hInst); CDialog::OnTimer(nIDEvent);
    }
    内存会不定时的增加4K,不知道是为什么?(环境:VC6+win2000  使用模块定义文件def导出的函数packcap)
      

  7.   

    4k是一个页面的大小。每次应用程序需要内存的时候,windows会分配给程序4k大小的内存
    ==========广告签名============
    http://shop33712512.taobao.com
    淘宝店,专卖化妆品、自家蜂产品
    ==========广告签名============
      

  8.   

    用PURIFY跑一遍,就可以检测出来了
      

  9.   

    4K 8K不能说明什么问题
    你设置一个循环,反复1000次,如果内存增长4K*1000,才可以说明有问题。
      

  10.   

    很明显问题出在这一句p=Packcap(a);
    Packcap内部肯定进行了内存分配,否这你定义的p所指向的内存怎么来的?