其实已经有很多帖子提到通过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参数
un