C++入门C/C++的内存管理介绍
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++入门C/C++的内存管理介绍相关的知识,希望对你有一定的参考价值。
1、为什么要研究内存管理?
(1)程序员写的程序可以分为动态和静态两种状态。静态:就是程序被存放在ROM中,也就是磁盘、固态硬盘、eMMC等存储介质;动态:程序被执=行,此时程序在RAM内存中运行;
(2)内存是计算机中十分重要的资源。首先几乎所有的程序运行时都需要内存
(3)内存资源很有限,32位的CPU理论上最多接4G内存(实际都不支持接4G),虽然64位的CPU可以接足够大的内存,但是内存本身很贵(查查内存条的价格和容量就知道),并且内存接太多发热和功耗也是一个问题;
(4)现在计算机中内存是由操作系统同一管理,程序员写的程序都是通过操作系统提供的API去申请内存(使用的虚拟内存),操作系统只是提供相对基础的内存管理,防止不了程序员写一些低质量代码造成内存泄漏;
(5)高级语言会对操作系统提供的内存管理接口进行进一步封装,增加一些新的特性,降低程序员的编程难度;比如:C++提供new和delete机制来管理内存;
2、计算机中如何管理内存
(1)OS提供最基本的内存管理体系,OS直接管理物理内存,并向应用层提供一套内存接口,应用层使用的是虚拟内存;
(2)C++写的项目基本都是运行在操作系统之上的,很少有裸机,C++封装了一套内存管理机制(new和delete);
(3)编程人员写的代码在编译工具链、运行时、OS等体系的帮助下最终在计算机物理层运行;
(4)OS提供的只是申请、释放等最基本的内存管理功能,程序员可以根据自己的需求去申请、释放内存,内存管理由OS和程序员共同维护;
3、C/C++的可以内存区域划分
(1)栈区:对应局部变量;
(2)全局数据区/静态数据区:对应全局变量和静态局部变量;
(3)coanst数据区:就是我们在代码中用const关键字修饰的变量,但是内存管理中并不存在这里概念,是编译器提供的机制;
(4)代码段:存放我们写的程序,只读的;
(5)堆区(heap):就是我们动态申请、释放的内存,malloc和free来管理;
(6)C++新增自由存储区:由new申请得到的动态内存区域;
总结:写代码中内存使用的风险主要来自于堆区,因为需要程序员来申请释放,完全由程序员的水平高低来确保内存管理是否正确;
4、new和malloc的区别
(1)malloc是C库函数,new是C++运算符关键字(C语言不支持new);
(2)malloc申请大小由传参确定,而new不需要传参,对象本身大小由编译器自动计算出;
(3)malloc返回值是void *,因此需要强制类型转换,而new返回值类型为确定的对象指针类型;
(4)malloc对应free,new对应delete;
(5)malloc只单纯的负责申请内存,并不会对申请的内存做初始化,所以我们对malloc申请到的内存一般都会再memset清零,而new可以带初始化;
(6)new在申请内存时会执行类的构造函数,而malloc没有构造函数这个概念;
(7)malloc失败返回NULL,而new失败引发bad_alloc异常;
(8)在linux中,new内部是封装malloc实现的,增加了调用构造函数;
总结:malloc只是单纯的申请一块内存;new会对申请的内存做一些初始化工作,但是new的开销也更大;
5、解决内存管理的三种思路
(1)完全由程序员负责内存的申请、释放,典型:C语言的malloc和free;
(2)由程序员和内存自动管理机制共同管理内存,典型:C++的智能指针;
(3)完全由自动管理机制去管理内存,程序员不再操作内存的申请、释放,典型:java的垃圾回收机制;
6、C++引入智能指针
6.1、指针的优势和劣势
(1)指针变量本质上和其他类型变量没有区别,只不过指针变量存放的数据比较特殊(是一个地址),可以解引用;
(2)指针变量对应于底层的寄存器间接寻址,所以指针的存在是十分必要的;
(3)指针的优势:灵活,允许程序员直接操作内存,给程序员的编程更多自由度,可以让程序员写出高效率的代码;
(4)指针的劣势:太灵活,如果程序员的水平不够高很容易写出垃圾代码,比如野指针问题、内存泄漏问题;当复杂业务中,和动态内存、构造、析构挂钩后,由于复杂度的提高程序员很容易出错;
6.2、智能指针的实现
(1)智能指针:将普通的简单纯指针封装成栈式符合指针对象;
(2)智能指针本身定义为局部变量,分配在栈内存上,并且是自动回收;
(3)当函数退出时,智能指针因为是局部变量会被弹栈,将智能指针指向的内存回收;
(4)智能指针的正常使用通过一些提供的方法和运算符重载来使用;
6.3、智能指针的优劣势
(1)智能指针是对普通指针的封装,增加了自动释放的机制,降低程序员的编程难度;
(2)智能指针进行动态内存管理,要比普通指针多出很多开销,毕竟新增加的特性都是需要开销的;
(3)智能指针的实现不是唯一的,C++有很多智能指针,各有优劣和适用场景,如:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost::intrusive_ptr;
7、推荐
我会在C++专栏持续根据更新C++相关的知识点,这里也给大家推荐一款学习C++的神器,我也是在用这一款神器在学习C++。
链接:学习神器跳转
如果你是想入门C++这门语言或者是找C++岗位的工作,都推荐你试试这个网站,里面有针对C++知识点的选择题、编程题,更有C++岗位的面试题
以上是关于C++入门C/C++的内存管理介绍的主要内容,如果未能解决你的问题,请参考以下文章