您的位置:首页 > 其它

一处容易忽略的内存泄露问题

2013-04-11 21:55 176 查看
在网络通信程序中定义一个函数用来接收数据,并将数据保存在一个WSABUF结构体中

WSABUF结构体在msdn中定义如下:

typedef struct _WSABUF {

u_long len; //长度

char FAR *buf; //数据缓存

} WSABUF, FAR * LPWSABUF;

在RecvMsg()中调用WSARecvFrom接收数据

void RecvMsg()

{

WSABUF wsabuf;

wsabuf.buf=new char[200];

//此处有内存泄露,因为销毁结构体时指针所指向的内存不会被释放

wsabuf.len=200;

DWORD dwRead;

DWORD dwFlag=0;

SOCKADDR_IN addrFrom;

int len=sizeof(SOCKADDR);

CString str;

CString strTemp;

HOSTENT *pHost;

if(SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,

(SOCKADDR*)&addrFrom,&len,NULL,NULL))

{

MessageBox("接收数据失败!");

return 0;

}

//Do other things

}

一开始并没有想太多,以为wsabuf是函数中的一个局部变量,函数结束后会被自动销毁,那么那块申请的内存也会自动被收回。

但是我利用死循环for(;;)不断调用这个函数后发现我的内存直线上升,并且很快程序崩溃: Microsoft C++ exception: std::bad_alloc at memory location 0x0030f580..

仔细一想,这里动态申请的内存其实并没有释放。因为局部变量在栈中申请,而wsabuf.buf所指向的内存是在堆中动态申请的。函数结束后,结构体在栈中的内存释放

buf保存的是地址值只占四个四节。而在堆中那块动态申请的内存并没有释放,并且唯一能够访问它的指针也被销毁了,这块内存发生了泄露。

解决的办法是在函数退出时delete掉申请的内存就好了

delete [] wsabuf.buf;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: