内存泄漏,应该判断什么?malloc&free, HeapAlloc&HeapFree???微软的谎言??

verybigbug 2002-08-15 01:39:43
为了发现内存泄漏,我们一般判断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,,,为什么可以容忍别人对内存的泄漏????
...全文
1130 159 打赏 收藏 转发到动态 举报
写回复
用AI写文章
159 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy_show 2002-09-15
  • 打赏
  • 举报
回复
微软的C Runtime库的确没有自己释放一些资源,而是最终把是释放内存的工作交给了操作系统,这些资源包括一些全局的同步对象以及全局的数据结构等,我不觉得这样做会导致什么问题,因为这些资源在整个程序的运行期都会需要,交给操作系统去释放完全是合情合理的。即使在Unix系统中,这样的做法也是很常见的。Unix程序员在一个程序发生无法恢复的运行时错误时,一个简洁的方法就是直接调用exit函数,让系统释放与进程相关的资源,这不会导致什么不良的后果。
这个世界上有没有放之四海而皆准的道理,我不知道,但是在处理具体问题上,我觉得不必完全拘泥于某个规则,因为规则只是在某些情况下有意义,所以我不喜欢强加的规则,正如我们不喜欢微软的作风。我好像在<<C++语言的设计与演化>>中看到作者Bjarne Stroustrup说过,他为什么没有把C++设计成一个完全面向对象的语言,因为他不喜欢把自己的思想强加于人,所以才把C++设计成可以容纳多种程序设计风格。所以我们才有了这样伟大的语言,在C++中,你可以非常高明,也可以非常拙劣,可以非常诡异,也可以非常优雅。我想我是因此才喜欢C++的吧。
在这儿,我经常看到一些近乎于钻牛角尖的讨论,我觉得没什么意义,当然有时候这些争论也能带来一定的乐趣。
shuicai 2002-09-14
  • 打赏
  • 举报
回复
up
aerospace 2002-09-13
  • 打赏
  • 举报
回复
up
fl1980 2002-09-12
  • 打赏
  • 举报
回复
关注!!!
mengqifeng 2002-09-08
  • 打赏
  • 举报
回复
不错
larrin2002 2002-09-08
  • 打赏
  • 举报
回复
请访问
http://javaptr.cosoft.org.cn
JavaPtr帮助里解决内存泄漏问题,使你可以向Java一样使用指针,同时提供内存泄漏检测。
hxd1114 2002-09-06
  • 打赏
  • 举报
回复
看来帖主的困惑不是是否能释放,而是为什么ms不遵守规则~
ammycute 2002-09-05
  • 打赏
  • 举报
回复
你能确定argv没有放出吗???

它只是一个参数,main()也只是一个函数!!
如下程序:

main()
{
char *p = malloc(1000*sizeof(char));
callFunc(p);
}

callFunc(char*)是另一个函数,在它里面能放出p 吗?
toby 2002-09-05
  • 打赏
  • 举报
回复
sclzmbie(梦里红尘) 的说法还是比较客观的。
Eros 2002-09-04
  • 打赏
  • 举报
回复
crt的函数你用过吗?不要在这胡说八道,一大堆的内存检测函数自己不用说什么malloc,free配对,笑话,你编程序时每次都在数malloc和free的个数吗?


newlily2000 2002-09-04
  • 打赏
  • 举报
回复
gz
vioy 2002-09-03
  • 打赏
  • 举报
回复
关注
olmouse 2002-09-03
  • 打赏
  • 举报
回复
int main()
{
char* p = malloc(100);
return 0;
}
我觉得这段程序不应该叫内存泄漏,
int main()
{
char* p;
char ch[128];
p=new char[100];
....
p=ch;
....
}
这段程序中长度为100的使用new分配的内存,在执行p=ch以后就无法在访问了,这个才叫内存泄漏。
内存泄漏的定义不是什么delete 和new 之类匹配的问题,而是内存中的一个块无法再访问到。
writeus 2002-09-02
  • 打赏
  • 举报
回复
好热闹!我想,MS$不明确在source中释放argv,有其道理,起码,可以减小程序的大小。
AsonJia 2002-09-02
  • 打赏
  • 举报
回复
我比較贊成前面有幾個仁兄的意見,由誰分配的memory就由誰釋放,至於為甚麼我們在許多地方看不見memory被釋放,我想windows已經或者vc已經給我們處理了.我們不必要這樣去斤斤計較,非的去仔細的看過每個被new或者是malloc的memory被delete或者是被free掉.
否則的話,我看我們得仔細看一下windows的很多底層的原代碼了.要不然怎麼能知道那些memory是怎麼被釋放掉的.
tonnyue 2002-08-31
  • 打赏
  • 举报
回复
关注
dragon_lei 2002-08-29
  • 打赏
  • 举报
回复
very nice ,i can study more from here
billik 2002-08-28
  • 打赏
  • 举报
回复
up
yxin 2002-08-27
  • 打赏
  • 举报
回复
关注!
wolaiye3 2002-08-25
  • 打赏
  • 举报
回复
关注!
加载更多回复(139)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧