动态分配的内存有必要在程序结束前由程序释放么?

wisec 2002-08-15 11:05:44
在Linux和Windows中用 c 语言开发程序,一些函数(例如 malloc 和 strdup )动态分配的内存,有必要在程序中加入语句,在程序结束前释放么?操作系统会不会自动在程序结束的时候把这些内存释放而不用编程者关心?
...全文
400 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
天外飞狐 2002-08-22
  • 打赏
  • 举报
回复
假如有谁说用malloc分配的内存可以不用free释放的话,他肯定是没有编过实际的程序,只是一些小儿科。

想一想假如你要编写一个不停止的程序,如防火墙;他要不停的malloc内存,而你又不释放他们,你的内存将会很快用完,这叫内存泄漏,我看你要是在那家公司这样做的话,你可能很快就要变成无业有名!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
LaoLi_SC_008 2002-08-22
  • 打赏
  • 举报
回复
TO silverfoxking(银狐):
看了你的话,我真的感到很高兴,我们聚到CSDN上来不就是需要这样的氛围吗:在技术问题上针锋相对、各抒己见;在私人问题上大家能成为好朋友,彼此鼓励。这难道不是我们最需要的东西吗?

TO ahao(天·狼·星星):
我很感谢你的针锋相对,因为它促使我作更深层次的思考,了解更多的内容,如:GC(虽然这实在有点通俗),在某种程度上扩大了我的知识面。但我实在不得不说,你的看法实在有点偏颇,我不明白你跟我大谈smart pointer 和 GC 跟我们讨论的问题有何联系?
GC本身就是JAVA(确切地说应是JVM)的东西,这尚且不说,就算Windows自带的一个线程,实现了GC,那又怎么样(当然这会导致效率的大幅下降)?这只是一个外部的东西,就如同你自己写一个程序来监控另一些程序的运行一样,与被监控程序的内存分配本质实在毫无联系。这就好像Intel的P4功能是如此的强劲,可是我们中国为什么要研制自己的CPU一样。
至于 smart pointer ,我想说的就是这只是程序编制的一种方法,其本质与自己释放内存并无差别,只是由于前人先进的构思,它显得更加自动化,更加安全,更加巧妙而已。
看问题,我想应多看看本质,只有本质的东西了解了,你才可能不建出危房。
LaoLi_SC_008 2002-08-21
  • 打赏
  • 举报
回复
首先声明:我并非想要攻击谁,只是想在技术问题上作进一步的探讨和研究,这完全与对个人好恶无关。其实我们彼此并不认识,我们聚在这里就是为了把问题越辩越明,不是吗?
现在我就之前提出的问题作一回答,不对之处,还望指出。
1.学过操作系统原理的人都知道,OS装载一个程序,会给它分配一定
的内存空间,并对该内存空间进行管理。当应用程序需要动态分配内存时
,OS会在一定范围内给予分配。这样在应用程序退出的时候,OS就会释
放所有属于该程序的内存,包括动态分配的内存。
2.内存泄漏 memory leak 发生在程序内部,下段程序将会产生memory leak:
void main()
{
int *iptr_1 = new int;
int *iptr_2 = new int;
iptr_1 = iptr_2;//将 iptr_2 指向的地址赋给了 iptr_1 ,
//那原来 iptr_1 指向的内存就丢失了
delete iptr_2;
}

如前所述,memory leak 发生在程序内部,虽然对程序来说它丢失了,
但对 OS 而言,它仍是属于该程序的一部分,所以当程序退出后,这部分leak memory 仍将被释放。
3. "C++具有内存自动回收功能" 这句话本身就是极荒谬的,C++是什么?
它只是一种编程语言而已,而内存的自动回收由什么完成,相信前文已讲得很明白了。

以上是就以前的问题作一回答,下面就网友的议论表示一点个人想法:
1.内存的回收由 OS 自动完成,并不代表我们就手动释放了,这是不同的两个方面。因为 OS 自动回收内存是在程序退出的时候,所以为了确保程序在运行时的安全性、稳定性,我们必须手动释放。这对于运行时间短、内存需求少的程序来说,不容易看出它的好处,在这时这样做更多的是出于一种良好的习惯。但当我们的程序需要长时间运行的时候(一般情况下是作为服务器运行),任何一丁点的memory leak都是致命的,它将不断吞噬内存,直到耗尽。
2.至于楼上这位的话,我实在没有什么好说的,可能大学还没毕业吧,可以原谅。
如果大家不信小弟所言,那可以自写一段极暴力的程序来测试一下,如:
void main()
{
int *iptr_1 ;
while(true)
iptr_1 = new int;
}
silverfoxking 2002-08-21
  • 打赏
  • 举报
回复
to LaoLi_SC_008(力):
听君一席话,胜读十年书。如今我又知道了自己身上还有如此多的缺陷(虽然我还不至于是一个白痴)。所谓夸人容易骂人难(没事闲的谁骂你啊),比较冲的话往往说明有它的价值,多多交流,大家都是朋友,望在以后的日子里更深刻的探讨比较模糊的问题。
to ahao(天·狼·星星):
一天没来,发生了这么多是非,怎么说呢?真的非常感谢你对我的维护与支持,交个朋友。不过,大家聚在一起,应更多的阐明问题的实质,其实我们都是为了求知。LaoLi_SC_008(力)的话也有它的道理,拉起手,让我们共同进步。希望大家团结起来,为求知而奋斗。
punpuny 2002-08-21
  • 打赏
  • 举报
回复
写完程序后用LeaveScan,CodeCheck之类的工具进行一下检查,可以查出许多隐患。我相信没有人会故意不释放吧:)
fannwong1982 2002-08-21
  • 打赏
  • 举报
回复
可以不释放,但是释放是一个好习惯。
Yssss1980 2002-08-21
  • 打赏
  • 举报
回复
我觉得new一下再delete一下,这多对称呀

对称就是完美,写程序就是要追求完美的。

结论:

new
+ = Perfect!Yeah!
delete
alienmaster 2002-08-21
  • 打赏
  • 举报
回复
大家讲的都不错,受益匪浅
sandrowjw 2002-08-21
  • 打赏
  • 举报
回复
OS把该内存区域设为占用,但是程序失去了对于该内存区域的引用,所以对于程序来说是丢失了,对于OS没有,但是OS并不会把它释放,所以还是属于浪费内存。JAVA由于采用了类似于引用记数的作法,并且由垃圾收集器释放引用记数为0的对象所占用的内存,所以不会丢失对于大部分内存区域的引用(除非你用很怪的方式获取内存),但是封装一个中间层是有代价的。
ahao 2002-08-21
  • 打赏
  • 举报
回复
to LaoLi_SC_008(力):

看了你的回答我真的觉得很可笑,没错,你说的东西是没有错,但是给我的感觉就是一个小学生很努力认真的给大学生解释为什么5+6=11一样,并且无知地认为对方什么都不懂。

银狐所说的“你可以借助特殊的模版实现动态内存的自动回收”指的就是在析构函数里删除用new分配的内存,关于这点,如果你不懂,那只能说明一个问题,你根本不懂C++。
写一个模板类封装原始指针的大部分行为,这叫智能指针,一旦超出作用域,它自动释放分配了的内存,这很重要,特别是要求异常安全的地方。对于其他的资源,也可以采用类似的手法。boost库里有好几个smart pointer类的实现。详细的我不解释了,你自己拿本C++的入门书好好看看吧。

另外,你大谈特谈操作系统会怎么怎么(这是任何一个学过windows开发的人都知道的常识),却丝毫也没有提到Garbage Collector,垃圾收集器,可见你可能从来就没有听说过有这回事。
在Java中由JVM负责垃圾回收,对应用程序来说是透明的。它为了能正确释放对象,必须监控每一个对象的状态,包括创建、引用被引用、赋值等,都需要进行监控。它的收集策略是影响应用程序性能的重要因素,使用增量式GC会好些。

可能导致程序效率低就是为什么C++里没有标准GC机制的原因。
IamWhoIam 2002-08-20
  • 打赏
  • 举报
回复
其实对于内存的分配和释放,对于c/c++来说一直是激烈争论的话题,我个人的一点不成熟的看法,希望不会成为被恶毒的人攻击的目标:
1.Memory Leak会造成系统的不稳定,所以程序员应当关心这个问题.
2.对于一个简易的使用内存很小的系统,运行时间短的系统,如果因为水平的问题您可以不考虑.
3.电信级的,或是运行时间长,内存操作频繁的系统应当,而且必须要进行释放.
4.内存分配是有堆和椎的区别的.
5.不记得释放自己new或是malloc的内存的程序员不应当是一个真正的程序员.

Over.
ahao 2002-08-20
  • 打赏
  • 举报
回复
to LaoLi_SC_008(力):
你懂c++吗?我不觉得silverfoxking(银狐)有哪里说错了。
LaoLi_SC_008 2002-08-20
  • 打赏
  • 举报
回复
TO: silverfoxking(银狐)
我很佩服你有这样的勇气,在自己都是似而非的时候还能在别人面前夸夸其谈,换了我肯定是不行的。
看来你对以下几个真的缺乏了解:
1.Windows如何对应用程序进行管理,怎样Load,怎样分配内存,然后怎样Free.
2."内存泄漏"如何发生,以及到底泄漏到什么地方去了。它在程序退出后还会存在吗?
3."C++具有内存自动回收功能"这句话通顺吗?所谓回收者,必先分配,内存分配是由C++编译器还是C++语法(这本身就是一个荒谬的命题)完成的吗?
自己先把这些问题搞搞清楚吧!
tonyts 2002-08-20
  • 打赏
  • 举报
回复
一般来说,会引起内存泄漏.
而且不管如何,分配内存之后,释放内存,都是一个良好的习惯.
所以,有必要释放内存.
born20c 2002-08-19
  • 打赏
  • 举报
回复
程序中没有释放内存不仅会有内存耗尽的危险,还有可能堆变量的内存空间挤占其他的变量空间,这样的现象有人遇到过,排除这样的错误及其困难.

不释放内存是十分危险的,因为它造成的后果"不确定".
不确定的意思是:程序在你写的时候可以运行,测试的时候也不会发现问题,但是到了客户那里运行的时候,就崩溃了.
sandrowjw 2002-08-19
  • 打赏
  • 举报
回复
一定要释放,C和C++是非常容易出内存问题的,所以处理内存泄漏是一个非常头疼的问题,这里有一篇文章,你可以看看:
http://www.5xsoft.com/data/200203/1815130901.htm
guoming1 2002-08-19
  • 打赏
  • 举报
回复
C/C++中如果你不释放的话,会造成内存泄漏,给你的软件安全造成隐患啊
qfsb_p 2002-08-19
  • 打赏
  • 举报
回复
应该要FREE掉,这不光关系到你系统的稳定,也关系到了安全问题,因为别人可以写个小程序对你未FREE掉的内存进行操作;当然这也是个良好的编程习惯!
Toon 2002-08-19
  • 打赏
  • 举报
回复
可以不释放啊,系统会帮你做的(不过只有笨蛋才会详细系统啊!!!!)
不过作为一种习惯,应该释放了啊!!
johnmack 2002-08-19
  • 打赏
  • 举报
回复
一定要释放,不是为了系统...





















是为了你自己
加载更多回复(7)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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