c++:内存管理
内存管理
-
程序就是数据加算法
(1)写程序是为了解决某个问题,生活中的问题最终被计算机抽象为控制或运算
(2)CPU中的主要构件就是运算器和控制器,本质上是一堆组合逻辑电路,表现为机器指令集
(3)一个问题对应一个程序,一个程序分为多个函数,一个函数分为多个机器指令
(4)存储机器指令需要内存,机器指令的执行过程需要内存参与,这是内存的2大作用
(5)算法对应机器指令(ROM内存),数据对应RAM内存,CPU对应工作机器
(6)越是偏底层的语言,越对内存管理具体化,效率也越高,同时对编程者要求也越高 -
计算机中如何管理内存
(1)C++项目大多数对应在操作系统中运行,很少有裸机的
(2)OS提供最基本的内存管理体系,OS直接管理物理内存,并向应用层提供一套内存接口
(3)C++语言对OS的内存接口进行封装,提供给编程者一套内存使用方法
(4)编程人员写的代码在编译工具链、运行时、OS等体系的帮助下最终在计算机物理层运行
C语言可用内存区域
(1)栈,对应局部变量
(2)全局数据区/静态数据区,对应全局变量,静态局部变量
(3)const数据区,在内存层面是不存在的,是C编译器营造出来的
(4)代码段,放可执行程序的,性质是rom
(5)堆heap,由malloc和free来管理的一块内存
C++新增内存区域
(1)自由存储区,由new申请得到的动态内存区域
(2)new操作符使用举例
/分配在heap中,指针p是指向a的,指针p自身是分配在栈上的
int *p = (int *)malloc(4);
*p = 7;//使用p指向的那4个字节的内存(a)
free(p);//释放p指向的那4个字节的内存(a)//C++中用新关键字new和delete替代了malloc和freeint *p = new int; // P本身是分配在栈上的,p指向的是一个int类型的数,占4字节//这4个字节分配在自由存储区*p = 10;cout << "*p:" << *p << " p:" << p << endl;delete (p);
new和malloc的区别
(1)malloc是C库函数,new是C++运算符关键字
(2)malloc申请空间大小靠传参确定,而new不需要传参,对象本身大小由编译器自动计算给出
(3)malloc返回值为void *因此需要强转,而new返回值类型为确定的对象指针类型
(4)malloc对应free释放,new对应delete和delete[]释放
(1)malloc只能申请内存不能带初始化,而new可以带初始化
(2)new会执行类的构造函数而malloc不会
(3)malloc失败返回NULL,而new失败引发bad_alloc异常
(4)申请和释放数组类型时不同
总结:
理解可用内存区域堆、栈、全局数据区、自由存储区
会使用new、delete
理解new和malloc的区别
学习记录,侵权联系删除。
来源:朱老师物联网大课堂