您的位置:首页 > 编程语言 > C语言/C++

c/c++ error:GetAdaptersInfo调用失败后重复调用,导致内存溢出

2015-01-28 14:57 411 查看
1、一开始一看就知道是 内存泄露 的问题,但是没有猜到 ,这个内存泄露 不是我自己开辟的内存引起的,而是因为一个函数的 实参 传递错误 引起的。

2、我将 最原始 正确的代码 ,一点点地添加我 当前的代码,没有发现任何问题。当我更新 嫌疑最大 的Get_My_IP_MAC函数时,就出现bug了。

3、我对这个函数的 更新 主要出在 写程序日志 上,最后 仔细 看msdn 才发现,错误出在了这里:
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) 
		{
			WriteLog("GetAdaptersInfo error:%lu",GetAdaptersInfo( pAdapterInfo, &ulOutBufLen));
			GlobalFree (pAdapterInfo);
			pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
		}
4、因为GetAdaptersInfo函数在 内存不够 时,会自动将所需要的内存大小 写进 第二个参数中,因此在WriteLog中第二次调用该函数时,需要读取的buffer变大了,而实际的buffer空间却依旧很小,也就是GetAdaptersInfo需要2个尺寸的长度,而实际第一个实参还没有被分配新的内存,还是一个尺寸的长度,因此,还导致内存泄露。正确的方法应如下:
if (( dwResult = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) )!= ERROR_SUCCESS) 
		{
			WriteLog("GetAdaptersInfo error:%lu",dwResult);
			GlobalFree (pAdapterInfo);
			pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
		}
或者是:
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) 
		{
			WriteLog("GetAdaptersInfo error:%lu",GetAdaptersInfo( pAdapterInfo, &ulOutBufLen));
			GlobalFree (pAdapterInfo);
			pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
		}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐