我在以下代码中使用Microsoft的WLAN API(我只留下了示例中的相关部分):
WLAN_INTERFACE_INFO_LIST
structure
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
WLAN_INTERFACE_INFO pIfInfo = NULL;
WlanEnumInterfaces(hClient, NULL, &pIfList);
pIfInfo = pIntfList->InterfaceInfo[i];
WlanFreeMemory(pIfList);
我正在将活动界面(位于pIntfList->InterfaceInfo[i]
)保存到pIfInfo
。
WlanFreeMemory(pIfList)
还会释放pIfInfo
并使此变量无用吗?或者在执行pIfInfo = pIntfList->InterfaceInfo[i]
时将其值复制到新结构?
有没有办法避免保留整个WLAN_INTERFACE_INFO
结构变量而只保留PWLAN_INTERFACE_INFO
?
答案 0 :(得分:1)
WlanFreeMemory(pIfList)
还会释放pIfInfo
并让这个变量无效吗?
没有。您的变量pIfInfo
实际上是结构而不是指针。所以当你写
WLAN_INTERFACE_INFO pIfInfo = NULL;
WlanEnumInterfaces(hClient, NULL, &pIfList);
pIfInfo = pIntfList->InterfaceInfo[i];
您正在获取结构的副本。请注意,代码无法编译,因为您无法将NULL
分配给结构。另请注意,pIfInfo
是一个糟糕的名称选择,因为它意味着读取变量是一个指针。
现在,对WlanFreeMemory(pIfList)
的调用将释放所有已分配的内存,包括数组pIntfList->InterfaceInfo[]
。但是,因为您获取了结构的副本,该数组的元素i
的副本不会影响您。
我可能会写这样的代码:
PWLAN_INTERFACE_INFO_LIST pIfList;
if (WlanEnumInterfaces(hClient, NULL, &pIfList) != ERROR_SUCCESS)
{
// handle error
}
WLAN_INTERFACE_INFO IfInfo = pIntfList->InterfaceInfo[i];
WlanFreeMemory(pIfList);
// can still use IfInfo, but not pIfList