c/c++ error:GetAdaptersInfo调用失败后重复调用,导致内存溢出
2015-01-28 14:57
411 查看
1、一开始一看就知道是 内存泄露 的问题,但是没有猜到 ,这个内存泄露 不是我自己开辟的内存引起的,而是因为一个函数的 实参 传递错误 引起的。
2、我将 最原始 正确的代码 ,一点点地添加我 当前的代码,没有发现任何问题。当我更新 嫌疑最大 的Get_My_IP_MAC函数时,就出现bug了。
3、我对这个函数的 更新 主要出在 写程序日志 上,最后 仔细 看msdn 才发现,错误出在了这里:
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); }
相关文章推荐
- c/c++ error:在GetAdaptersInfo循环中使用strcat时,忘记清空strcat导致 内存溢出 异常
- c++builder error:[Linker Error] Unresolved external 'GetAdaptersInfo' referenced from……
- c/c++ error:GetAdaptersInfo第二个实参未被赋值,GetMac.exe 已停止工作
- IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败
- 查询Access时候,报错误:IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- VS2012 C++ 中通过GetAdaptersInfo获取多网卡,多IP地址信息
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败
- Runtime.getRuntime().exec 导致的内存溢出
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- Access里的Case效果 “IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败!”的解决方法!
- CreateFileMapping调用失败,GetLastError返回值为1006
- AXIS的"dotnet_soapenc_bugfix"属性会自动重设的bug,将导致c++客户端调用soap接口失败
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败
- 关于UpdateLayeredWindow调用失败返回0但是Getlasterror为0的问题
- IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败
- 使用gdb调试内存重复释放导致的malloc_error_break错误崩溃