在次讨论内存泄露

minanqiang 2004-12-12 12:29:43
下面是我对内存泄露的一点看法:
对于是不是内存泄露,还是要抓住定义,即能不能到达?
第一:一般的局部变量如int i都是在栈中分配,都会在程序退出的时候,自动弹出栈。所以栈中的变量和分配的内存不会出现内存泄露。

第二:对于堆中的分配的内存。这种内存的释放一般由两种释放情况,1,自己手工释放。(new delete)2,由系统释放。谈谈第2点,由要有系统释放,所以系统必须要知道为程序分配内存的地址。如果不知道的话,就不能正确释放。比如上面的
pi = new int;(1)
pi=new int;(2)

第(1)个分配的内存就不会由系统释放。因为丢失了它本身的地址。系统不知道如何找到它。
第(2)个可以被系统释放,即使没有被DELETE。
...全文
174 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wy99sinacom 2004-12-15
  • 打赏
  • 举报
回复
乱说,不要误导人啦
fwinfwin 2004-12-15
  • 打赏
  • 举报
回复
思维太局限了吧,
你那个程序经常退出是垃圾程序,
要是你这样写个操作系统,开两天就要重新启动一次了
要是你这样写个服务器程序,只怕服务器很快被你的程序拖瘫痪了
minanqiang 2004-12-13
  • 打赏
  • 举报
回复
lkforever 2004-12-12
  • 打赏
  • 举报
回复
支持!
minanqiang 2004-12-12
  • 打赏
  • 举报
回复
各位老大,我做了实验。
是面有些观念我有错。支持boyb()
不论你是否手动释放new出的空间,当你退出程序时必定释放所有空间!
minanqiang 2004-12-12
  • 打赏
  • 举报
回复
楼上的能讲下理由吗?
sharkhuang 2004-12-12
  • 打赏
  • 举报
回复
系统当然知道哪个进程用那些类存了哦!所以进程退出全部释放
minanqiang 2004-12-12
  • 打赏
  • 举报
回复
to boyb() 你好:
是呀,这个我也同意。
2)中的内存只有当你退出程序才释放,这个我同意呀。补充一点,如果眼光放在你本身自己程序的内存区域的话,那也算一种内存泄露,因为你不能使用那段内存了。但是程序一退出。肯定是释放内存。

对于1)就不一定。堆分配内存一般都是从全局堆中分配。可能不只你一个程序使用。操作系统也无从跟踪,只是根据内核对象计数器来判断,如果内核对象为0,则释放,否则不释放。再则,上面的代码中,如果操作系统如果根本不知道程序用到的内存。没有记录。内存页面也不会知道那片内存使用过。内核对象的计数器只加1,未必会减1。从;而发生内存泄露。
你我他111 2004-12-12
  • 打赏
  • 举报
回复
to 天上的飞鸟:
1)中的内存,操作系统应该是可以跟踪到吧,因为,操作系统一般是分配一段大块内存,然后在
这个大块内存中分配你需要的大小,当这个大块内存被分配完后,才会再次向系统申请大块内存
2)中申请的内存,如果你程序不退出,操作系统怎么知道你已经使用完了这块内存呢??
mengxiangfengwz 2004-12-12
  • 打赏
  • 举报
回复
同意楼上的说法
icu111 2004-12-12
  • 打赏
  • 举报
回复
支持!
minanqiang 2004-12-12
  • 打赏
  • 举报
回复
(1)中的内存由于操作系统无法得知进程获得那些内存,是不会释放的。所以我还是认为(1)的内存释放不了。
(2)中申请的内存,因为系统得到程序内存的地址,即使你不手工释放,也能被系统释放。
你我他111 2004-12-12
  • 打赏
  • 举报
回复
我是这样认为的:
(1)中申请的内存,当应用程序退出后,也是可以由系统释放的,因为操作系统负责释放一个进程占用的所有资源
(2)中申请的内存,如果你不手工释放,并且应用程序没有退出(有些应用程序永远不退出,如在一些嵌入式系统),它也不会被系统释放

64,642

社区成员

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

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