一处容易忽略的内存泄露问题
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;
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;
相关文章推荐
- arc下容易忽略的内存问题
- leakcanary作者发现的一个Dialog的各种listener容易引发的内存泄露问题
- php header(location)容易被忽略小问题
- 内存泄露问题分析
- 内存泄露问题
- MFC中onctlcolor函数返回的画刷导致的内存资源泄露问题
- openssl DTLS连接内存泄露问题
- 使用valgrind 检查内存 泄露 等问题
- android开发中,可能会导致内存泄露的问题
- Python开发容易忽略的问题
- Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
- 解决JS内存泄露之js对象和dom对象互相引用问题
- Js内存泄露问题
- 容器存放指针造成的内存泄露问题
- Android Handler当做内部类,导致内存泄露的问题解决方案
- 使用时容易忽略SQL Server的21个问题
- 使用时容易忽略SQL Server的21个问题
- .NET中常见的内存泄露问题——GC、委托事件和弱引用
- mysql中容易忽略的问题
- android GC内存泄露问题