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

时间:2016-12-04 01:18:53

标签: c++ console-application

我复制了一些我在线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;
}

1 个答案:

答案 0 :(得分:1)

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