目录:
- 数据分布
- 局部数据
- 静态数据
- 常量数据
- 动态申请的数据
- 内存的分布
- 栈
- 内存映射段
- 堆
- 数据段
- 代码段
- 题目
- 基础部分
- 提升部分
- 内存分配
- new和delete语法
- c/c++ new malloc以及delete free区别
- operator new 和 operator delete函数
- 内存泄漏
数据分布
程序中存储的数据分为:
1.局部数据
2.静态数据和全局数据
3.常量数据
4.动态申请的数据
1.局部数据
定义的局部变量(如实现数据交换时定义的变量)
经常存在于函数里定义的变量-》》存在于调用函数时开辟的栈帧里面
2.静态数据和全局数据
存在于整个进程中
3.常量数据
不可被修改的–如常量字符串
扩展:
左值:可以修改的值就可以认为是左值,左值通常是变量。
右值:通常是常量,表达式或者函数返回值等(临时对象)
误区:等号左边为左值,等号右边为右值
4.动态申请的数据
比如数据结构中经常使用
内存的分布
内存分布笼统的可以分为者四个区域。
1.栈
2.堆
3.静态区(也可以叫做数据段)
4.常量区(也可以叫做代码段)
栈地址空间是自上而下的。
堆地址空间是自下而上的。
1. 栈
又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。
扩展:为什么局部变量在栈中存储呢?
因为调用函数需要建立栈帧(局部变量则在这里面),而栈帧本质就是即用即销毁
2. 内存映射段
是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共
享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
3. 堆
用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段
存储全局数据和静态数据。
5. 代码段
可执行的代码/只读常量。
扩展:
编译好的指令在文件中,程序运行时指令就存在代码段
我们平时写代码会存储到磁盘(文件):没运行的可执行文件叫程序
运行的时候会加载到内存:正在运行的程序叫进程
题目
基础部分:
globalVar和staticGlobalVar和staticVar在数据段(静态区),因为globalVar在全局域创建的,staticVar和staticGlobalVar有static关键字修饰。
localVar和num1在栈
提升部分:
char2在栈,虽然“abcd”存储在代码段(常量区),但char2是一个数组,数组的名字代表该数组的首地址,这里的char char2[] = ”abcd“ 赋值 底层是创建了一个栈的数组拷贝了”abcd“,此"abcd"非彼”abcd“
所以*char2也在栈,指向的是‘a’
pChar3在栈,首先解释”abcd“存储位置,字符串常量是存储在代码段里的。pChar3:创建的一个变量存储代码段的首地址
所以*pChar在代码段
ptr1在栈,ptr1 malloc后*ptr是指向堆空间的,但ptr是一个变量存储堆的地址
所以*ptr在堆
答案:CCCAA AAADAB
内存分配
new 和 delete语法
C/C++ new malloc 以及 delete free 区别:
1.new 和 delete 是操作符,而malloc和free是函数
看malloc free和 new delete的颜色也有区别
2.malloc和new都有申请堆空间的功能,free和delete都有释放空间的功能
那为什么C++要加入他们呢?
其一:语法更简洁
其二:new与delete比他们功能更多,当我们new自定义类的时候编译器还会调用自定义类的构造函数,delete自定义类的时候编译器会自动调用析构函数
3.new的东西能不能用free掉呢?malloc的东西能不能delete掉呢?
我们并不推荐这样写,最好配套使用。
就好比上半身西装配短裤拖鞋,有些时候可能你觉得很帅,当进入正式严肃的场合的时候你是上不了台面的
operator new与operator delete函数
operator new和 operator delete是系统提供的全局函数 如果申请内存失败了,这里会抛出bad_alloc 类型异常
new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
new = operator new+构造函数
operator new = malloc + 失败抛异常处理
delete = operator delete + 析构函数
operator delete 和 free基本没差别
内存泄漏
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死