对象的创建和生命期
在使用对象时,最关键的问题之一是它们的生成和销毁方式。每个对象为了生存都需要资源,尤其是内存当我们不再需要一个对象时,它必须被清理掉,使其占有的资源可以被释放和重用。
C++中为了追求最大的执行速度,对象的存储空间和生命周期可以再编写程序时确定,这可以通过将对象置于堆栈(或称为自动变量automatic variable)或限域变量scoped variable或静态存储区域来实现。这种方式将存储空间分配和释放置于优先考虑的位置,但是也牺牲了灵活性,因为必须在编写程序时知道对象确切的数量、生命周期和类型。
在被称为堆(heap)的内存池中动态地创建对象。在这种方式中,直到运行时才知道需要多少对象,它们的生命周期如何,以及它们的具体类型是什么。这些问题的但只能在程序运行时相关代码被执行到的那一刻才能确定。如果需要一个新对象,可以在需要的时刻直接在堆中创建。因为存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间(需要的时间可能要远大于在堆栈中创建存储空间的时间)。在堆栈中创建存储空间和释放存储空间通常各需要一条汇编指令,分别对应将栈指针向下移动和将栈指针向上移动。创建堆存储空间的时间依赖于存储机制的设计。
动态方式的一般性的逻辑假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。
JAVA完全采用了动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。
对象生命周期,对于允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以自动销毁它。如果是在堆上创建对象,编译器就会对它的生命周期一无所知。
C++中,必须通过编程方式来确定何时销毁对象,有可能因为不能正确处理而导致内存泄漏。
JAVA中提供了被称为垃圾回收器的机制,可以自动发现对象何时不再被使用,并继而销毁它。垃圾回收器提供了更高层的保障,可以避免暗藏的内存泄漏问题。
JAVA的垃圾回收器被设计用来处理内存释放问题(不包括清理对象的其他方面),垃圾回收器知道对象何时不再被使用,并自动释放对象占用的内存。这一点和所有对象都是继承自单根基类Object以及只能以一种方式创建对象(在堆上创建),这三点使得JAVA编程较C++编程更简单