0

次のコードでは、Microsoft の WLAN API を使用しています (例から関連する部分のみを残しました)。

WLAN_INTERFACE_INFO_LIST構造

WLAN_INTERFACE_INFO構造

WlanEnumInterfaces()関数

WlanFreeMemory()関数

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か?

4

1 に答える 1

1

WlanFreeMemory(pIfList)また、この変数を解放pIfInfoして役に立たないままにしますか?

いいえ、変数pIfInfoは実際にはポインターではなく構造体です。だからあなたが書くとき

WLAN_INTERFACE_INFO pIfInfo = NULL;
WlanEnumInterfaces(hClient, NULL, &pIfList); 
pIfInfo = pIntfList->InterfaceInfo[i];

あなたは構造体のコピーを取っています。構造体に割り当てることができないため、コードはコンパイルされないことに注意してくださいNULLpIfInfoまた、変数がポインターであることを読み取りに暗示するため、名前の選択が不適切であることに注意してください。

ここで、 を呼び出すと、WlanFreeMemory(pIfList)割り当てられたすべてのメモリ ( array を含む) が解放され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
于 2016-03-24T12:00:00.257 に答える