吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1430|回复: 10
收起左侧

[求助] 根据ip获取MAC地址, 报错内存泄漏, 求帮忙看看

[复制链接]
yangli920814 发表于 2020-11-19 19:42
环境: win10 + vs2017
问题: 在第二次pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; 有内存泄露

#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库


void CTestRegeditOperationDlg::OnBnClickedButton5()
{
        // TODO: 在此添加控件通知处理程序代码
        PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
        unsigned long stSize = sizeof(IP_ADAPTER_INFO);
        int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
        if (ERROR_BUFFER_OVERFLOW == nRel)
        {
                delete pIpAdapterInfo;
                pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
                //memset(pIpAdapterInfo, NULL, stSize);
                nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
        }




        if (ERROR_SUCCESS == nRel) {
                while (pIpAdapterInfo)
                {
                        //根据描述过滤
                        //"wmware" "virtualbox"
                        char szDesc[MAX_PATH] = { 0 };
                        strcpy(szDesc, pIpAdapterInfo->Description);
                        _strlwr(szDesc);


                        if (strstr(szDesc, "vmware") != NULL || strstr(szDesc, "virtualbox") != NULL ||
                                strstr(szDesc, "VPN") != NULL || strstr(szDesc, "VMware") != NULL || strstr(szDesc, "Virtualbox") != NULL ||
                                strstr(szDesc, "VMnet") != NULL) {
                                pIpAdapterInfo = pIpAdapterInfo->Next;
                                continue;
                        }


                        //根据网卡类型过滤:网卡类型:MIB_IF_TYPE_ETHERNET:有线网卡 IF_TYPE_IEEE80211:无线网卡
                        if (pIpAdapterInfo->Type != MIB_IF_TYPE_ETHERNET && pIpAdapterInfo->Type != IF_TYPE_IEEE80211)
                        {
                                pIpAdapterInfo = pIpAdapterInfo->Next;
                                continue;
                        }






                        //可能网卡有多IP,因此通过循环去判断
                        IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
                        CString csIpString;
                        do {
                                csIpString = pIpAddrString->IpAddress.String;
                                if (strcmp("192.168.80.153", csIpString.GetBuffer(100)) == 0) {
                                        char szMac[MAX_PATH] = { 0 };
                                        for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
                                        {
                                                if (i < pIpAdapterInfo->AddressLength - 1)
                                                {
                                                        char szItem[MAX_PATH] = { 0 };
                                                        sprintf(szItem, "%02X:", pIpAdapterInfo->Address);
                                                        strcat(szMac, szItem);
                                                }
                                                else
                                                {
                                                        char szItem[MAX_PATH] = { 0 };
                                                        sprintf(szItem, "%02X\n", pIpAdapterInfo->Address);
                                                        strcat(szMac, szItem);
                                                }
                                        }
                                        MessageBox(szMac);
                                        break;
                                }
                               
                                pIpAddrString = pIpAddrString->Next;
                        } while (pIpAddrString);




                        pIpAdapterInfo = pIpAdapterInfo->Next;
                }
        }
        else {
                MessageBox("获取网卡信息失败!");
        }


        delete pIpAdapterInfo;
        pIpAdapterInfo = NULL;
}
1.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

穆塔muta 发表于 2020-11-19 20:15
看得我一脸懵逼
赵纯良 发表于 2020-11-19 20:23
 楼主| yangli920814 发表于 2020-11-19 20:35

是格式看不习惯么, 你可以复制到你的编辑器下
 楼主| yangli920814 发表于 2020-11-19 20:36

是格式看不习惯么, 你可以复制到你的编辑器下
山上石 发表于 2020-11-19 21:05
这是扫描局域网IP获得机器的MAC?
说好的 发表于 2020-11-19 21:53
这看着好难受,也看不懂
qq554071942 发表于 2020-11-19 22:15
太难了,看不懂
cube 发表于 2020-11-20 12:26

new BYTE[]
delete []

 楼主| yangli920814 发表于 2020-11-20 15:32
cube 发表于 2020-11-20 12:26

new BYTE[]
delete []


跟这无关,用了也还是有泄漏.





        int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
        BOOL isArryApply = FALSE;
        //记录网卡数量
        int netCardNum = 0;
        int IPnumPerNetCard = 0;
        if (ERROR_BUFFER_OVERFLOW == nRel)
        {
                isArryApply = TRUE;
                delete pIpAdapterInfo;
                pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
                //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
                nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
        }
.......
........
        //释放内存空间
        if (isArryApply){
                delete []pIpAdapterInfo;
        }else
                delete pIpAdapterInfo
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-16 11:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表