C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息时内存释放问题

其实已经有很多帖子提到通过GetAdaptersInfo方法获取网卡信息,但是使用过程中发现有内存泄漏的问题。仔细看了下 IP_ADAPTER_INFO这个结构体,这其实是一个链表结构,一开始用递归的方法遍历所有节点删除,发现内存泄漏还是没有解决,然后继续看了他的成员变量,部分成员变量也是链表结构。

typedef struct _IP_ADAPTER_INFO {
    struct _IP_ADAPTER_INFO* Next;
    DWORD ComboIndex;
    char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
    char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
    UINT AddressLength;
    BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
    DWORD Index;
    UINT Type;
    UINT DhcpEnabled;
    PIP_ADDR_STRING CurrentIpAddress; //链表结构,有next指针
    IP_ADDR_STRING IpAddressList;
    IP_ADDR_STRING GatewayList;
    IP_ADDR_STRING DhcpServer;
    BOOL HaveWins;
    IP_ADDR_STRING PrimaryWinsServer;
    IP_ADDR_STRING SecondaryWinsServer;
    time_t LeaseObtained;
    time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

如果需要遍历删除的话,那么还需要遍历这些成员变量,才能将所有内存都释放,考虑到申请内存的时候是一块连续的地址,因此用一个BYTE*的指针记住首地址,释放的时候直接调用delete []ptr;

//得到结构体大小,用于申请内存,及GetAdaptersInfo参数
	unsigned long stSize = sizeof(IP_ADAPTER_INFO);
	//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
	BYTE* pHeadIpAdapterInfo = new BYTE[stSize];
	PIP_ADAPTER_INFO pIpAdapterInfo = (PIP_ADAPTER_INFO)pHeadIpAdapterInfo;
	
	//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
	int nRet = GetAdaptersInfo(pIpAdapterInfo,&stSize);
	if (ERROR_BUFFER_OVERFLOW == nRet)
	{
		//如果函数返回的是ERROR_BUFFER_OVERFLOW
		//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
		//这也是说明为什么stSize既是一个输入量也是一个输出量
		//释放原来的内存空间
		if (pHeadIpAdapterInfo)
		{
			delete []pHeadIpAdapterInfo;
			pHeadIpAdapterInfo = NULL;
		}
		//重新申请内存空间用来存储所有网卡信息
		pHeadIpAdapterInfo = new BYTE[stSize];
		pIpAdapterInfo = (PIP_ADAPTER_INFO)pHeadIpAdapterInfo;
		//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
		nRet = GetAdaptersInfo(pIpAdapterInfo,&stSize);
	}
	//省略部分业务代码...
	if (pHeadIpAdapterInfo)//内存释放
	{
		delete []pHeadIpAdapterInfo;
		pHeadIpAdapterInfo = NULL;
	}	

这是我目前想到的方法,如果有更好的方法欢迎下方留言。

获取适配器信息参考的帖子:http://www.cnblogs.com/L-hq815/archive/2012/08/04/2622829.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值