关于使用过GetAdaptersInfo函数,内存释放的有关问题
关于使用过GetAdaptersInfo函数,内存释放的问题。
MSDN源程序:
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
pAdapter = pAdapterInfo;
while (pAdapter) {
printf( "\tAdapter Name: \t%s\n ", pAdapter-> AdapterName);
printf( "\tAdapter Desc: \t%s\n ", pAdapter-> Description);
printf( "\tAdapter Addr: \t%ld\n ", pAdapter-> Address);
printf( "\tIP Address: \t%s\n ", pAdapter-> IpAddressList.IpAddress.String);
printf( "\tIP Mask: \t%s\n ", pAdapter-> IpAddressList.IpMask.String);
printf( "\tGateway: \t%s\n ", pAdapter-> GatewayList.IpAddress.String);
printf( "\t***\n ");
if (pAdapter-> DhcpEnabled) {
printf( "\tDHCP Enabled: Yes\n ");
printf( "\t\tDHCP Server: \t%s\n ", pAdapter-> DhcpServer.IpAddress.String);
printf( "\tLease Obtained: %ld\n ", pAdapter-> LeaseObtained);
}
else
printf( "\tDHCP Enabled: No\n ");
if (pAdapter-> HaveWins) {
printf( "\tHave Wins: Yes\n ");
printf( "\t\tPrimary Wins Server: \t%s\n ", pAdapter-> PrimaryWinsServer.IpAddress.String);
printf( "\t\tSecondary Wins Server: \t%s\n ", pAdapter-> SecondaryWinsServer.IpAddress.String);
}
else
printf( "\tHave Wins: No\n ");
pAdapter = pAdapter-> Next;
}
}
else {
printf( "Call to GetAdaptersInfo failed.\n ");
}
pAdapter是分配空间的,为什么不需要释放呢?
我自己释放了下,一释放就出错,请高人解答。
------解决方案--------------------
释放pAdapter干什么,应该释放pAdapterInfo,再仔细看看代码吧,pAdapter又接着指向下一个节点了
MSDN源程序:
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
pAdapter = pAdapterInfo;
while (pAdapter) {
printf( "\tAdapter Name: \t%s\n ", pAdapter-> AdapterName);
printf( "\tAdapter Desc: \t%s\n ", pAdapter-> Description);
printf( "\tAdapter Addr: \t%ld\n ", pAdapter-> Address);
printf( "\tIP Address: \t%s\n ", pAdapter-> IpAddressList.IpAddress.String);
printf( "\tIP Mask: \t%s\n ", pAdapter-> IpAddressList.IpMask.String);
printf( "\tGateway: \t%s\n ", pAdapter-> GatewayList.IpAddress.String);
printf( "\t***\n ");
if (pAdapter-> DhcpEnabled) {
printf( "\tDHCP Enabled: Yes\n ");
printf( "\t\tDHCP Server: \t%s\n ", pAdapter-> DhcpServer.IpAddress.String);
printf( "\tLease Obtained: %ld\n ", pAdapter-> LeaseObtained);
}
else
printf( "\tDHCP Enabled: No\n ");
if (pAdapter-> HaveWins) {
printf( "\tHave Wins: Yes\n ");
printf( "\t\tPrimary Wins Server: \t%s\n ", pAdapter-> PrimaryWinsServer.IpAddress.String);
printf( "\t\tSecondary Wins Server: \t%s\n ", pAdapter-> SecondaryWinsServer.IpAddress.String);
}
else
printf( "\tHave Wins: No\n ");
pAdapter = pAdapter-> Next;
}
}
else {
printf( "Call to GetAdaptersInfo failed.\n ");
}
pAdapter是分配空间的,为什么不需要释放呢?
我自己释放了下,一释放就出错,请高人解答。
------解决方案--------------------
释放pAdapter干什么,应该释放pAdapterInfo,再仔细看看代码吧,pAdapter又接着指向下一个节点了