程序退出能否自动释放分配的内存(new,allocate)

mafirst 2003-12-15 03:11:11
会导致内存泄漏吗?
...全文
964 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mafirst 2003-12-16
  • 打赏
  • 举报
回复
好,谢谢大家。
phoenixDream 2003-12-15
  • 打赏
  • 举报
回复
楼主应该看看操作系统原理,对进程的管理是操作系统的基本功能,即使是使new,malloc分配内存空间也是通过向操作系统申请而得到自己所使用的内存的,如果一个程序长时间运行而没有把自己申请得到但没有使用的内存释放的话,那么就发生了内存泄漏。但是当程序结束时,对于操作系统来说就是它的一个进程已经结束了(不管你是非法还是正常),操作系统都会回收你所使用的内存(要知道,当你的程序运行时,不仅仅有你通过malloc,new所申请的内存,还有你的程序所占用的其他空间等,包括代码区,数据区,这些都会回收。
楼主问的是“程序退出能否自动释放分配的内存”,可从三方面来看:
1)如果用new,malloc分配的而没有用delete,free释放的话,你的程序当然不会自动释放分配的内存,
2)如果是通过int a=0;这样的语句来分配的话,会在它的生命域之外被自动释放。
3)在你的程序退出后,操作系统会把你的程序使用的所有空间回收。
有什么没说清楚的希望各位指教。
byyyyy 2003-12-15
  • 打赏
  • 举报
回复
如果操作系统不管这事,还有谁管!
说的很对!
wbh0360 2003-12-15
  • 打赏
  • 举报
回复
如果操作系统不管这事,还有谁管!
RedFoxC 2003-12-15
  • 打赏
  • 举报
回复
如果是正常退出的话,会释放的,如果不是正常退出的话!

那就不能这么说喽!!!!!
nickle 2003-12-15
  • 打赏
  • 举报
回复
其实这个问题是防止内存泄漏重不重要的问题。
在C专家编程中,作者说明了这个问题:(对不起我只有英文版)
Memory Leaks

Some programs don't need to manage their dynamic memory use; they simply allocate what they need, and never worry about freeing it. This class includes compilers and other programs that run for a fixed or bounded period of time and then terminate. When such a program finishes, it automatically relinquishes all its memory, and there is little need to spend time giving up each byte as soon as it will no longer be used.
Other programs are more long-lived. Certain utilities such as calendar manager, mailtool, and the operating system itself have to run for days or weeks at a time, and manage the allocation and freeing of dynamic memory.
可见防止内存泄漏只对长时间运行的程序有意义,同时作者也说明了即使程序自己不释放内存,内存也会被自动释放,那么除了操作系统还会有谁呢?^_^
mafirst 2003-12-15
  • 打赏
  • 举报
回复
哪种说法正确啊?我认为系统会收回程序分配的内存。高手给一个权威说法。
wildcat1984 2003-12-15
  • 打赏
  • 举报
回复
用auto_ptr吧,有一定局限性,不过很方便,不用自己释放
ryyy 2003-12-15
  • 打赏
  • 举报
回复
to aojunpeng313001(倦鸟):

下面是一个没有释放的小程序,你在尽量没有其他需要申请内存的进程运行时,快速地多运行这个程序几次,你会发现每次malloc到的那个地址是一样的,也就是说操作系统在你这个进程退出时是会帮你处理这些问题的。我是win2k+vc6.0

#include<stdio.h>
#include<stdlib.h>

int main()
{
int *a;

a = (int *)malloc(sizeof(int));

printf("%d\n", &a);

return 0;
}
sevencat 2003-12-15
  • 打赏
  • 举报
回复
windows核心编程第71页:
虽然进程确实没有机会执行自己的清除操作,但是操作系统可以在进程之后进行全面的清
除,使得所有操作系统资源都不会保留下来。这意味着进程使用的所有内存均被释放,所有打
开的文件全部关闭,所有内核对象的使用计数均被递减,同时所有的用户对象和G D I 对象均被
撤消。一旦进程终止运行(无论采用何种方法),系统将确保该进程不会将它的任何部分遗留下
来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝
马迹。希望这是很清楚的。
注意Te r m i n a t e P r o c e s s 函数是个异步运行的函数,也就是说,它会告诉系统,你想要
进程终止运行,但是当函数返回时,你无法保证该进程已经终止运行。因此,如果想
要确切地了解进程是否已经终止运行,必须调用Wa i t F o r S i n g l e O b j e c t 函数(第9 章介绍)
或者类似的函数,并传递进程的句柄。
进程中的线程何时全部终止运行
如果进程中的所有线程全部终止运行(因为它们调用了E x i t T h r e a d 函数,或者因为它们已
经用Te r m i n a t e P r o c e s s 函数终止运行),操作系统就认为没有理由继续保留进程的地址空间。这
很好,因为在地址空间中没有任何线程执行任何代码。当系统发现没有任何线程仍在运行时,
它就终止进程的运行。出现这种情况时,进程的退出代码被设置为与终止运行的最后一个线程
相同的退出代码。

gao_dragon 2003-12-15
  • 打赏
  • 举报
回复
同意,如果是JAVA就会自己释放了
shenyiwen 2003-12-15
  • 打赏
  • 举报
回复
在进程结束时回收该进程申请的资源是操作系统的基本功能之一.
如果不能回收属于操作系统的缺陷.
aojunpeng313001 2003-12-15
  • 打赏
  • 举报
回复
不同意楼上的看法,程序不会释放,系统也不会释放,不信你多运行几次就发现内存减少了,速度变慢了,就是因为没有释放!
ryyy 2003-12-15
  • 打赏
  • 举报
回复
对于new,malloc等函数分配的内存,如果没有使用delete、free函数释放,那么在程序正常退出情况下,程序不会释放掉已分配的内存。

nod,但是操作系统会释放
sevencat 2003-12-15
  • 打赏
  • 举报
回复
对于new,malloc等函数分配的内存,如果没有使用delete、free函数释放,那么在程序正常退出情况下,程序不会释放掉已分配的内存。

//no agree
shenyiwen 2003-12-15
  • 打赏
  • 举报
回复
不会有泄露. 操作系统将回收程序分配的内存, 但共享内存除外.
LinuxPanther 2003-12-15
  • 打赏
  • 举报
回复
哈哈。。
又看到有星星的人了。
楼主。相信有星星的人了。
不过,用new分配的一定要用delete释放
用malloc分配的一定要用free
daizh 2003-12-15
  • 打赏
  • 举报
回复
对于new,malloc等函数分配的内存,如果没有使用delete、free函数释放,那么在程序正常退出情况下,程序不会释放掉已分配的内存。
csjinjian 2003-12-15
  • 打赏
  • 举报
回复
如果是正常退出,会释放内存,如果是abort(),就不会

65,183

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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