应该类似与COM的引用计数机制吧。关于Java的GC资料应该是很多的,不过中文的好像没有。中国人对Java不感兴趣。

解决方案 »

  1.   

    实际上,需要一个基类抽象tobj,然后需要一个单件模式的管理器tb负责进行指针管理即可。
    然后,你的类体系以tobj为顶级节点开始生长,一切搞定。不推荐重载new,表面看来似乎是釜底抽薪的最佳解决,但是其他的类库的工作,其他代码的工作可能会因此错误。
      

  2.   

    //nod
    但是我觉得关键在于“怎么判断对象没有引用?”,也就是说如何判断对象出了作用域?
      

  3.   

    那正是Java所付出的代价。只不过Java由于是从头做起,于是还可以采用一些算法来提前进行部分回收,如同你所期望的那样进行工作着。这是必然的结果。你可能会有一些局部性的方法尽可能尽快回收,但恐怕不会是全局性的,这涉及到的复杂性会使得你这个工作慢而且累,没有必要。界面清理之前:主窗口收到WM_QUIT时,开始清理所有程序的窗口资源之前。
    这时候,一般会清理一部分不需要的数据,结束线程等等,然后,会关闭所有窗口,然后会结束全部其他线程,清理其他全局性数据,最后关闭主线程(即进程),完成最后的关闭动作。
      

  4.   

    也对。
    编译器还得知道那个对象是一个副本(引用),还是是原件。但是,C++已经支持上述特性了,这对于栈上的对象适用。堆对象的目的就是为了给你提供自行管理内存的能力,当然应该自行负责其释放。
    所以Java不使用指针,也并不提供你自行管理内存的能力。事实上,我情愿手写释放语句。
      

  5.   

    我想需要自己建立强大的内存管理机制,实现内存的管理,
    Apache服务器软件使用链表实现了自己的内存管理模块,
    C++本身没有这种功能,所以只能自己实现,方法有二。
    (1)自己建立强大的内存管理机制
    (2)类似于COM的智能指针
      

  6.   


        Apache服务器的内存管理方法与C/C++差不太多。C/C++把内存分配、回收的方法作为语言级别已经实现了,唯一与Java不同的是它把选择何时回收垃圾的权利交给了程序员而不是编译器,以实现更大的灵活性。比如你申请了一个n兆的内存块,那么在C/C++中不用的话,用Free/delete干掉即可。而在Java/C#中,你必须等待虚拟机在某个它认为合适的时候才会释放它。    虚拟机是以类似辅助线程的形式来进行垃圾回收的。这也是Java程序效率不高的一个原因——你的执行时间片被划分的很细,中间插入了很多C/C++中没有的垃圾回收片断。
      

  7.   

    classfactory说得很是。另外,智能指针也是正解,只是有点费解。(我刚刚回答一个smart pointer问题,已经说得眼花花了,不想再考虑这个问题了)