在次讨论内存泄露

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

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

第(1)个分配的内存就不会由系统释放。因为丢失了它本身的地址。系统不知道如何找到它。
第(2)个可以被系统释放,即使没有被DELETE。

13 个解决方案

#1


支持!

#2


我是这样认为的:
(1)中申请的内存,当应用程序退出后,也是可以由系统释放的,因为操作系统负责释放一个进程占用的所有资源
(2)中申请的内存,如果你不手工释放,并且应用程序没有退出(有些应用程序永远不退出,如在一些嵌入式系统),它也不会被系统释放

#3


(1)中的内存由于操作系统无法得知进程获得那些内存,是不会释放的。所以我还是认为(1)的内存释放不了。
(2)中申请的内存,因为系统得到程序内存的地址,即使你不手工释放,也能被系统释放。

#4


支持!

#5


同意楼上的说法

#6


to 天上的飞鸟:
1)中的内存,操作系统应该是可以跟踪到吧,因为,操作系统一般是分配一段大块内存,然后在
这个大块内存中分配你需要的大小,当这个大块内存被分配完后,才会再次向系统申请大块内存
2)中申请的内存,如果你程序不退出,操作系统怎么知道你已经使用完了这块内存呢??

#7


to boyb() 你好:
是呀,这个我也同意。
2)中的内存只有当你退出程序才释放,这个我同意呀。补充一点,如果眼光放在你本身自己程序的内存区域的话,那也算一种内存泄露,因为你不能使用那段内存了。但是程序一退出。肯定是释放内存。

对于1)就不一定。堆分配内存一般都是从全局堆中分配。可能不只你一个程序使用。操作系统也无从跟踪,只是根据内核对象计数器来判断,如果内核对象为0,则释放,否则不释放。再则,上面的代码中,如果操作系统如果根本不知道程序用到的内存。没有记录。内存页面也不会知道那片内存使用过。内核对象的计数器只加1,未必会减1。从;而发生内存泄露。

#8


系统当然知道哪个进程用那些类存了哦!所以进程退出全部释放

#9


楼上的能讲下理由吗?

#10


各位老大,我做了实验。
是面有些观念我有错。支持boyb() 
不论你是否手动释放new出的空间,当你退出程序时必定释放所有空间!

#11


#12


乱说,不要误导人啦

#13


思维太局限了吧,
你那个程序经常退出是垃圾程序,
要是你这样写个操作系统,开两天就要重新启动一次了
要是你这样写个服务器程序,只怕服务器很快被你的程序拖瘫痪了

#1


支持!

#2


我是这样认为的:
(1)中申请的内存,当应用程序退出后,也是可以由系统释放的,因为操作系统负责释放一个进程占用的所有资源
(2)中申请的内存,如果你不手工释放,并且应用程序没有退出(有些应用程序永远不退出,如在一些嵌入式系统),它也不会被系统释放

#3


(1)中的内存由于操作系统无法得知进程获得那些内存,是不会释放的。所以我还是认为(1)的内存释放不了。
(2)中申请的内存,因为系统得到程序内存的地址,即使你不手工释放,也能被系统释放。

#4


支持!

#5


同意楼上的说法

#6


to 天上的飞鸟:
1)中的内存,操作系统应该是可以跟踪到吧,因为,操作系统一般是分配一段大块内存,然后在
这个大块内存中分配你需要的大小,当这个大块内存被分配完后,才会再次向系统申请大块内存
2)中申请的内存,如果你程序不退出,操作系统怎么知道你已经使用完了这块内存呢??

#7


to boyb() 你好:
是呀,这个我也同意。
2)中的内存只有当你退出程序才释放,这个我同意呀。补充一点,如果眼光放在你本身自己程序的内存区域的话,那也算一种内存泄露,因为你不能使用那段内存了。但是程序一退出。肯定是释放内存。

对于1)就不一定。堆分配内存一般都是从全局堆中分配。可能不只你一个程序使用。操作系统也无从跟踪,只是根据内核对象计数器来判断,如果内核对象为0,则释放,否则不释放。再则,上面的代码中,如果操作系统如果根本不知道程序用到的内存。没有记录。内存页面也不会知道那片内存使用过。内核对象的计数器只加1,未必会减1。从;而发生内存泄露。

#8


系统当然知道哪个进程用那些类存了哦!所以进程退出全部释放

#9


楼上的能讲下理由吗?

#10


各位老大,我做了实验。
是面有些观念我有错。支持boyb() 
不论你是否手动释放new出的空间,当你退出程序时必定释放所有空间!

#11


#12


乱说,不要误导人啦

#13


思维太局限了吧,
你那个程序经常退出是垃圾程序,
要是你这样写个操作系统,开两天就要重新启动一次了
要是你这样写个服务器程序,只怕服务器很快被你的程序拖瘫痪了