gpt4 book ai didi

c++ - 调用 Windows API 的 C++ 控制台程序中的内存泄漏

转载 作者:行者123 更新时间:2023-11-30 05:19:52 25 4
gpt4 key购买 nike

我复制了一些我在网上找到的代码here .我已经成功运行了它,但是如果我循环运行它,就会出现严重的内存泄漏。我主要使用 C# 编程,这个例子让我难以理解。有人能指出我修复内存泄漏的正确方向吗?这是我的完整 C++ 控制台应用程序。任何帮助表示赞赏。谢谢。

// ConsoleApplication1.cpp : Defines the entry point for the console     application.
//

#include "stdafx.h"
#include <iostream>
#include "Netlistmgr.h"




bool checkForCaptivePortalMode()
{
bool fCaptivePortalDetected = false;

// Initialize COM.
if (SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
{
// Declare a pointer to INetworkListManager
INetworkListManager* pNetworkListManager;

// Create instance of the CLSID_NetworkListManger COM object
if (SUCCEEDED(CoCreateInstance(CLSID_NetworkListManager, NULL,
CLSCTX_ALL, IID_INetworkListManager,
(LPVOID*)&pNetworkListManager)))
{
// Declare pointer to an IEnumNetworkConnections
IEnumNetworks* pEnum;

// Call to GetNetworks from INetworkListManager interface
if (SUCCEEDED(pNetworkListManager->GetNetworks
(NLM_ENUM_NETWORK_CONNECTED, &pEnum)) && pEnum != NULL)
{
INetwork *pINetwork;
HRESULT hr = pEnum->Next(1, &pINetwork, nullptr);
while (hr == S_OK)
{
if (pINetwork != NULL)
{
IPropertyBag *pNetworkPropertyBag;
HRESULT hrQueryInterface = pINetwork->QueryInterface
(IID_IPropertyBag, (LPVOID*)&pNetworkPropertyBag);
if (SUCCEEDED(hrQueryInterface) && pNetworkPropertyBag != nullptr)
{
NLM_CONNECTIVITY networkConnectivity;
VARIANT variantConnectivity;

if (SUCCEEDED(pINetwork->GetConnectivity(&networkConnectivity)))
{
if ((networkConnectivity &
NLM_CONNECTIVITY_IPV4_INTERNET) == NLM_CONNECTIVITY_IPV4_INTERNET)
{
VariantInit(&variantConnectivity);
if (SUCCEEDED(pNetworkPropertyBag->Read
(NA_InternetConnectivityV4, &variantConnectivity, nullptr))
&& (V_UINT(&variantConnectivity) &
NLM_INTERNET_CONNECTIVITY_WEBHIJACK) ==
NLM_INTERNET_CONNECTIVITY_WEBHIJACK)
{
fCaptivePortalDetected = true;
}
auto t = V_UINT(&variantConnectivity);
VariantClear(&variantConnectivity);
}
if (!fCaptivePortalDetected && (networkConnectivity
& NLM_CONNECTIVITY_IPV6_INTERNET) == NLM_CONNECTIVITY_IPV6_INTERNET)
{
VariantInit(&variantConnectivity);
if (SUCCEEDED(pNetworkPropertyBag->Read(NA_InternetConnectivityV6,
&variantConnectivity, nullptr)) &&
(V_UINT(&variantConnectivity) &
NLM_INTERNET_CONNECTIVITY_WEBHIJACK) ==
NLM_INTERNET_CONNECTIVITY_WEBHIJACK)
{
fCaptivePortalDetected = true;
}
VariantClear(&variantConnectivity);
}
}
}

pINetwork->Release();
}

if (fCaptivePortalDetected)
break;


hr = hr = pEnum->Next(1, &pINetwork, nullptr);
}
}
}
}

// Uninitialize COM.
// (This should be called on application shutdown.)
CoUninitialize();

return fCaptivePortalDetected;
}

int main()
{
for (;;)
{
bool check = checkForCaptivePortalMode();
std::cout << "\n" << check;
//char c = std::getchar();
}

return 0;
}

最佳答案

一方面,您永远不会调用 pNetworkListManager->Release()。更一般地说,在 C++ 中,如果您不使用智能指针,则必须确保每个资源分配都有一个匹配的释放。如果您在整个过程中使用智能指针,它会更容易并且可能使您的代码更简单。

关于c++ - 调用 Windows API 的 C++ 控制台程序中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40954374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com