讨论一下“自动垃圾收集”的原理如何?参加者有分

noho 2001-05-22 07:50:00
在运行时的任意时间内,
所有没有引用的对象会自动删除。通过将开发人员从手动内存管理任务中解放出来,垃圾收集使程序开发变得容易且不易
出错。但是,自动垃圾收集是耗时的,并且是不可预知的。

1、怎么判断对象没有引用?
2、如果增强C++支持自动垃圾收集,可以重载new得到对对象的引用,但是何时该自动释放对象?
...全文
187 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
noho 2001-05-28
  • 打赏
  • 举报
回复
怎么没人讨论了?
noho 2001-05-26
  • 打赏
  • 举报
回复
怎么没人讨论了?
noho 2001-05-25
  • 打赏
  • 举报
回复
hehe
laughsun 2001-05-24
  • 打赏
  • 举报
回复
我参加!呵呵
crackx 2001-05-24
  • 打赏
  • 举报
回复
我是来学习的。呵呵
liu_feng_fly 2001-05-24
  • 打赏
  • 举报
回复
c#也是垃圾收集,呵呵,方向呀
jy 2001-05-24
  • 打赏
  • 举报
回复
也对。
编译器还得知道那个对象是一个副本(引用),还是是原件。

但是,C++已经支持上述特性了,这对于栈上的对象适用。

堆对象的目的就是为了给你提供自行管理内存的能力,当然应该自行负责其释放。
所以Java不使用指针,也并不提供你自行管理内存的能力。

事实上,我情愿手写释放语句。
gpmn 2001-05-24
  • 打赏
  • 举报
回复
微软这样不就是鼓励我们多造垃圾吗?一笑
noho 2001-05-24
  • 打赏
  • 举报
回复
我昨天想了一天
我想自动垃圾收集应该是定义在语言这一级别上的
而不可能靠在现有的不支持自动垃圾收集的语言上添加代码能实现的
如果是语言这一级别上的
那么就很好解释“所有没有引用的对象会自动删除”
因为语言本身,或者说编译器本身知道每个对象的作用域
只要出了作用域,那么这个对象肯定就没有被引用
后台线程就可以自动释放对象了
happymeng 2001-05-24
  • 打赏
  • 举报
回复
实现的根本还在编译器
jy 2001-05-24
  • 打赏
  • 举报
回复
自动垃圾收集的代价就是牺牲性能和空间。

上面提及的都可以*部分的*加入这个特性。只能部分的地原因,是因为通常没必要也不可能放弃掉C++提供的各种类库或者函数,为了保持这些类库的可用性,我们不能全部运用上自动收集特性。
noho 2001-05-24
  • 打赏
  • 举报
回复
有没有可能在C++中加入自动垃圾收集的特性?
jy 2001-05-24
  • 打赏
  • 举报
回复
classfactory说得很是。

另外,智能指针也是正解,只是有点费解。(我刚刚回答一个smart pointer问题,已经说得眼花花了,不想再考虑这个问题了)
classfactory 2001-05-24
  • 打赏
  • 举报
回复

Apache服务器的内存管理方法与C/C++差不太多。C/C++把内存分配、回收的方法作为语言级别已经实现了,唯一与Java不同的是它把选择何时回收垃圾的权利交给了程序员而不是编译器,以实现更大的灵活性。比如你申请了一个n兆的内存块,那么在C/C++中不用的话,用Free/delete干掉即可。而在Java/C#中,你必须等待虚拟机在某个它认为合适的时候才会释放它。

虚拟机是以类似辅助线程的形式来进行垃圾回收的。这也是Java程序效率不高的一个原因——你的执行时间片被划分的很细,中间插入了很多C/C++中没有的垃圾回收片断。

noho 2001-05-24
  • 打赏
  • 举报
回复
谈论挺热烈的
大家都来谈点看法
happymeng 2001-05-24
  • 打赏
  • 举报
回复
我想需要自己建立强大的内存管理机制,实现内存的管理,
Apache服务器软件使用链表实现了自己的内存管理模块,
C++本身没有这种功能,所以只能自己实现,方法有二。
(1)自己建立强大的内存管理机制
(2)类似于COM的智能指针
jy 2001-05-23
  • 打赏
  • 举报
回复
那正是Java所付出的代价。只不过Java由于是从头做起,于是还可以采用一些算法来提前进行部分回收,如同你所期望的那样进行工作着。

这是必然的结果。你可能会有一些局部性的方法尽可能尽快回收,但恐怕不会是全局性的,这涉及到的复杂性会使得你这个工作慢而且累,没有必要。

界面清理之前:主窗口收到WM_QUIT时,开始清理所有程序的窗口资源之前。
这时候,一般会清理一部分不需要的数据,结束线程等等,然后,会关闭所有窗口,然后会结束全部其他线程,清理其他全局性数据,最后关闭主线程(即进程),完成最后的关闭动作。
noho 2001-05-23
  • 打赏
  • 举报
回复
这样是不是效率太低了
内存会一直分配知道程序结束才释放
另外,界面清理之前怎么理解?
jy 2001-05-22
  • 打赏
  • 举报
回复
不需要去判定。
1. 程序结束之前,
2. 界面清理之前
这两个点用来进行垃圾清理工作就够了。
noho 2001-05-22
  • 打赏
  • 举报
回复
//nod
但是我觉得关键在于“怎么判断对象没有引用?”,也就是说如何判断对象出了作用域?
加载更多回复(2)

16,472

社区成员

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

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

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