作为一个木有太多经验的"猿"类,相信总会犯一些在大牛们看来简直弱智的错误!或因基础不够扎实又或者本身的大意,而我犯了第二种,so,记录下来事情的缘起以及给自己的苦楚(烦恼).
事情的起因源于GetAdaptersInfo( _Out_ PIP_ADAPTER_INFO pAdapterInfo, _Inout_ PULONG pOutBufLen ) 函数,MSDN如此描述该函数The GetAdaptersInfo function retrieves adapter information for the local computer.(拿到本地网卡的信息),关键在于我忽略了或者是没有仔细看它的第一个参数的解释: pAdapterInfo [out] A pointer to a buffer that receives a linked list of IP_ADAPTER_INFO structures. 大概意思是指向一个缓冲链表,当初自己的理解 就是一个结构体指针,使用时便申请内存空间 让后传入该函数,而函数的本意是要传入一个存储整个列表的空间(现在是这么理解的,不知道对否 ,待验证),windows专门有这样的API来处理此种情况下的内存申请与释放( HeapAlloc,HeapFree );于是定义以下两个宏:
事情的起因源于GetAdaptersInfo( _Out_ PIP_ADAPTER_INFO pAdapterInfo, _Inout_ PULONG pOutBufLen ) 函数,MSDN如此描述该函数The GetAdaptersInfo function retrieves adapter information for the local computer.(拿到本地网卡的信息),关键在于我忽略了或者是没有仔细看它的第一个参数的解释: pAdapterInfo [out] A pointer to a buffer that receives a linked list of IP_ADAPTER_INFO structures. 大概意思是指向一个缓冲链表,当初自己的理解 就是一个结构体指针,使用时便申请内存空间 让后传入该函数,而函数的本意是要传入一个存储整个列表的空间(现在是这么理解的,不知道对否 ,待验证),windows专门有这样的API来处理此种情况下的内存申请与释放( HeapAlloc,HeapFree );于是定义以下两个宏:
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) //x表示要申请的大小,GetProcessHeap()获取调用进程的默认堆句柄
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) //x表示要释放的内存地址
如此 则能如C语言一般使用MALLOC与FREE来操作 pAdapterInfo [out] 参数的申请与释放,不会出现内存泄露的问题!! 微软后面的文档都推荐使用 GetAdaptersAddresses ()替代改函数.
在问题查找的过程中使用过自己的方法,虽然不怎么方便,当时勉强能用!对于C++内存泄露的问题 推荐一款 Visual Leak Detector 软件,使用很方便,有单独的配置文件可按照自己的需求配置.在工程中设置好相应的路径,只要包含一个头文件即可!(详细文档都在官网,留作以后了解),该软件对于追查QT的内存泄露 不太方便,官网也有说明,但是能缩小查找范围.
另外,新版本的GTest中有很多函数模板的参数超出了5个,而在VS2012中默认是五个,故需要做相应的修改 新版本的GTest才能编译通过,具体方法: 打开 xstddef 头文件 修改 #define _VARIADIC_MAX 5 宏的值 一般修改为 #define _VARIADIC_MAX 10 便够用.
庆幸的是有个好头儿,给我足够的时间学习!苦逼的是 继续战斗!Fighting!!!!!!!
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) //x表示要释放的内存地址
如此 则能如C语言一般使用MALLOC与FREE来操作 pAdapterInfo [out] 参数的申请与释放,不会出现内存泄露的问题!! 微软后面的文档都推荐使用 GetAdaptersAddresses ()替代改函数.
在问题查找的过程中使用过自己的方法,虽然不怎么方便,当时勉强能用!对于C++内存泄露的问题 推荐一款 Visual Leak Detector 软件,使用很方便,有单独的配置文件可按照自己的需求配置.在工程中设置好相应的路径,只要包含一个头文件即可!(详细文档都在官网,留作以后了解),该软件对于追查QT的内存泄露 不太方便,官网也有说明,但是能缩小查找范围.
另外,新版本的GTest中有很多函数模板的参数超出了5个,而在VS2012中默认是五个,故需要做相应的修改 新版本的GTest才能编译通过,具体方法: 打开 xstddef 头文件 修改 #define _VARIADIC_MAX 5 宏的值 一般修改为 #define _VARIADIC_MAX 10 便够用.
庆幸的是有个好头儿,给我足够的时间学习!苦逼的是 继续战斗!Fighting!!!!!!!