动态内存分配

来源:互联网 发布:webex软件下载 编辑:程序博客网 时间:2024/06/18 07:46

一、全局变量
全局变量未初始化和初始值为零的储存在BSS段,程序执行前会对BSS段的变量自动清零。
全局变量初始化非零时,储存在Data段
储存在Data段占得内存远大于BSS段。

二、静态变量
静态变量在第一次进入作用域时被初始化,后面不再初始化。
静态成员变量在类之间共享数据,也是放在全局/静态数据区中。并且只有一份拷贝。

三、常量
rodata(常量数据区)存放常量数据。
常量不一定放在rodata中,有些立即数直接和指令编码在一起,放在text中。
字符串常量,编译器会去掉重复的字符串,保证只有一个副本。
常量不能被修改。
字符串常量会被自动放到rodata中,加const关键字修饰的全局变量也在rodata中。

四、栈、堆
栈中储存自动变量或者局部变量,以及传递的参数等。
在一个函数内部定义了一个变量,或者向函数传递参数是,这些变量和参数储存在栈上,当变量退出这些变量的作用域时,这些栈上的存储单元会被自动释放。
堆是用户程序控制的存储区,存储动态产生的数据。
当用malloc/new来申请一块内存或者创建一个对象时,申请的内存在堆上分配,需要记录得到的地址,并且在不需要的时候释放这些内存。
栈一般很小,无法满足程序的需求。

五、生命周期
对象的生命周期是指对象从创建到被销毁的过程,创建对象时要占用一定的内存。因此整个程序占用的内存随着对象的创建和销毁动态变化。
变量的作用域决定了对象的生命周期。
全局对象在main之前被创建,main退出后被销毁。
静态对象和全局对象类似,第一次进入作用域被创建,但是程序开始时,内存已经分配好。
通过new创建对象,有点容易造成内存泄漏。通过new的对象一直存在,一直到被delete。
隐藏在中间的临时变量的创建和销毁,生命周期很短,容易造成问题。(拷贝构造

1 0