我做了一个主程序和几个dll,主程序调用dll,释放dll
从逻辑上我看不出有任何内存泄漏,但是在任务管理器中发现我每次调用dll
内存增长一些,释放dll后,内存释放一些,但是占用的内存大小比调用dll前大
4k或8k或其他。同时我发现,执行程序后到鼠标点机选中程序之间,内存占用也增长4k
不知道为什么?
从逻辑上我看不出有任何内存泄漏,但是在任务管理器中发现我每次调用dll
内存增长一些,释放dll后,内存释放一些,但是占用的内存大小比调用dll前大
4k或8k或其他。同时我发现,执行程序后到鼠标点机选中程序之间,内存占用也增长4k
不知道为什么?
应该好好看看那里的程序
至于下载地址,google一下:)
要通过VC的debug看。在程序运行中,程序会加载很多系统的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)
==========广告签名============
http://shop33712512.taobao.com
淘宝店,专卖化妆品、自家蜂产品
==========广告签名============
你设置一个循环,反复1000次,如果内存增长4K*1000,才可以说明有问题。
Packcap内部肯定进行了内存分配,否这你定义的p所指向的内存怎么来的?