内存泄漏,应该判断什么?malloc&free, HeapAlloc&HeapFree???微软的谎言??
为了发现内存泄漏,我们一般判断malloc&free&realloc和new&delete是否对应调用了。
如果malloc后没有进行free就可以认为是内存泄漏了。
我们又知道,malloc和new最后都调用了HeapAlloc来实现,delete和free是通过
HeapFree了实现,所以是不是可以认为只要检查HeapAlloc和HeapFree是否对应就
可以判断内存泄漏????
可是,不管你是调查HeapAlloc和HeapFree的调用统计结果,还是malloc/free的统计
结果,对于任何Windows程序而言,都不可能发现HeapAlloc和HeapFree的调用是相同
的。当然,malloc和free也是如此。
在VC的程序中,可以利用__argv变量进行访问命令行参数,这个变量在_setargv函数
中分配内存的(参考VC的 STDRAGV.c文件)。在程序结束时,你都找不到释放它的地方。
除了命令行,环境变量也是如此。
不要告诉我反正程序结束时,系统会自动释放所有内存。我的问题是为什么编译器不会
释放内存,而让系统释放。
比如:
int main()
{
char* p = malloc(100);
return 0;
}
这样的程序,p即使不释放,系统也会自动释放,但是,作为编程的你肯定会认为内存泄
漏,必须调用free(p); 但为什么微软不释放__argv呢??
你不能容忍p没有释放,为什么能容忍微软对__argv的内存不释放呢???
你要是跟踪HeapAlloc/HeapFree的话就会发现每个程序都大概有200个左右的HeapAlloc
没有调用HeapFree,,,为什么可以容忍别人对内存的泄漏????