标签:
一、C++
内存管理
1. 内存分配区域
[常量数据(const data)区:] 常量数据区存储字符串等在编译期间就能确定的值。类对象不能存在于这个区域中。在程序的整个生存周期内,区域中的数据都是可用的。 区域内所有的数据都是只读的,任何企图修改本区域数据的行为都会造成无法预料的后果。之所以会如此,是因为在实际的实现当中,即使是最底层的内部存储格式也受制于所实现的特定的优化方案。例如,一种编译器完全可以把字符串存放在几个重叠的对象里面――只要实现者愿意的话。 [栈(stack)区:] 栈区存储自动变量(automatic variables)。一般来说,栈区的分配操作要比动态存储区(比如堆(heap)或者自由存储区(free store))快得多,这是因为栈区的分配只涉及到一个指针的递增,而动态存储区的分配涉及到较为复杂的管理机制。栈区中,内存一旦被分配,对象就立即被构造好了;对象一旦被销毁,分配的内存也立即被收回(译注:这里作者用了“去配(deallocate)”一词,鄙人一律翻译为“回收”)。因此,在栈区中,程序员没有办法直接操纵那些已经被分配但还没有被初始化的栈空间(当然,那些通过使用显式(explicit)析构函数(destructor)和new运算符而故意这么做的情况不算在内)。 [自由存储区(free store):] 自由存储区(free store)是C++两个动态内存区域之一,使用new和delete来予以分配和释放(freed)。在自由存储区(free store)中,对象的生存周期可以比存放它的内存区的生存周期短;这也就是说,我们可以获得一片内存区而不用马上对其进行初始化;同时,在对象被销毁之后,也不用马上收回其占用的内存区。在对象被销毁而其占用的内存区还未被收回的这段时间内,我们可以通过void*型的指针访问这片区域,但是其原始对象的非静态成员以及成员函数(即使我们知道了它们的地址)都不能被访问或者操纵。 [堆(heap)区:] 堆(heap)区是另一个动态存储区域,使用malloc、free以及一些相关变量来进行分配和回收。要注意,虽然在特定的编译器里缺省的全局运算符new和delete也许会按照malloc和free的方式来被实现,但是堆(heap)与自由存储区(free store)是不同的――在某一个区域内被分配的内存不可能在另一个区域内被安全的回收。堆(heap)中被分配的内存一般用于存放在使用new的构造过程中和显式(explicit)的析构过程中涉及到的类对象。堆中对象的生存周期与自由存储区(free store)中的类似。 [全局/静态区(Global/Static):] 全局的或静态的变量和对象所占用的内存区域在程序启动(startup)的时候才被分配,而且可能直到程序开始执行的时候才被初始化。比如,函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化的。对那些跨越了翻译单元(translation unit)的全局变量进行初始化操作的顺序是没有被明确定义的,因而需要特别注意管理全局对象(包括静态类对象)之间的依赖关系。最后,和前面讲的一样,全局/静态区(Global/Static)中没有被初始化的对象存储区域可以通过void*来被访问和操纵,但是只要是在对象真正的生存周期之外,非静态成员和成员函数是无法被使用或者引用的。
ref1:Exceptional C++ Item35
标签:
原文地址:http://www.cnblogs.com/forcheryl/p/4551178.html