c++ base-内存管理

来源:互联网 发布:c语言中堆和栈的区别 编辑:程序博客网 时间:2024/06/02 02:33

1.变量

a) 静态变量和全局变量

i. 全局变量与局部变量:

1. 全局变量:存储在(非)初始化数据段(全局静态区)中;作用域是可以被别的文件引用extern关键字;生命周期是整个程序

2. 局部变量:存储在定义自己函数体的栈中;作用域是只对本函数体可见;生命周期是函数体

ii. 静态变量与非静态变量:

1. 静态变量:存储在静态区(全局静态区)(是和全局变量存放在一块的,初始化的静态变量和初始化的全局变量放在一块儿;非初始化的静态变量和非初始化的全局变量放在一块儿);作用域是取决于对方是全局变量,还是局部变量;生命周期是整个程序

b) 辨析

i. Static全局变量和普通全局变量有什么区别?

1. static全局变量和普通全局变量存储区域相同,不同的是:static全局变量只在声明此static全局变量的文件中有效,普通全局变量对整个程序都有效。(即存储位置相同,生命周期相同,但作用域发生了变化)

ii. Static局部变量和普通局部变量有什么区别?

1. Static局部变量存储在静态区,普通局部变量存储在栈中。因此static局部变量的生命周期是整个程序,而普通局部变量的生命周期则只是函数体调用期间。(即作用域相同,但存储区不同,生命周期也不同)


2.内存分配

a)程序占用内存分类

i.从高位地址开始依次是(命令行参数和环境变量)+栈+堆+全局静态区+正文段+文字常量区

命令行参数与环境变量

栈区(由高地址向低地址扩散) 存放函数的参数值,局部变量值等

堆区(由低地址向高地址扩散) 在程序中开辟的另一块存储区域

全局静态区           全局变量和静态变量

正文段                 程序的二进制代码

文字常量区           常量字符串



b)内存分配方式

i.在全局静态区分配:在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。(全局变量和静态变量)

ii.在栈区分配:在执行函数时函数内局部变量,参数等在栈上创建,在函数结束时这些内存自动释放

iii.在堆区分配:程序员自己用new,malloc分配free、delete回收



c)new/delete malloc/free

i.malloc/free是c语言的标准函数库,所以它不会自动调用构造和析构函数,而new和delete是c++的运算符,包装之后的malloc/free,会自动调用类的构造和析构函数。在功能上new/delete完全覆盖malloc/free。

0 0
原创粉丝点击