目录
3.1new/delete 和 mallc/free 的区别
今日喜讯
欢迎各位大佬们来到库森的博客,首先是我们的今日喜讯环节!!哦吼吼吼!!!
今天是2022年4月11日。今天看到常规赛最后一场的勇士,我想说,佛祖,我跪了!我承认我之前你的声音大了!
前言
好的,接下来我们进入正文。今天库森为大家带来的是有关C++内存管理的内容。之前在C语言中我们了解过有关C语言的内存管理,那么在C语言中,对于内存管理,我们有开辟空间的malloc类的函数,以及释放函数 free。那么在C++的内存管理又有什么区别呢?接下来我们一起看看吧!
一,回忆C/C++内存分布
那么首先我们依旧还是需要将C/C++内存分布做一下回忆。
在系统中,C/C++程序的内存区域一般会有如下几个方面,栈,堆,数据段(全局变量,静态变量),代码段(只读常量,执行代码等),如下图所示:
首先,在栈中存放的一般是一些局部变量以及临时变量,比如一些函数名,指针这些。
其次,对于堆内存来说,就是可以动态分配给我们程序员使用的一个大小为 2G 的内存区域。在C语言中,我们可以通过malloc以及类似的函数去申请空间,当然在不使用了之后,我们需要将其释放。
然后,对于数据段,或者我们可以将其称为静态区, 在这里会存放一些全局的变量,一些静态变量等,因为我们不希望这些数据的声明周期是在某一个函数调用完就结束,所以我们将其存放在数据段。
最后对于代码段,这里其实也可以称为静态区,因为它存放的内容依旧是一些常量。
二,C语言动态内存管理
在C语言中,我们会使用 malloc/calloc/realloc 这三个函数去开辟空间,而使用free函数去释放空间,那么具体对于这几个函数的使用,如果有小伙伴们有问题的话,可以查看up主这篇文件的解析哦!动态内存管理_菜还不承认的库森的博客-CSDN博客目录前言:一,malloc函数与free函数1.1malloc函数基本内容1.2实例分析malloc函数以及free函数1.3free函数基本内容二,calloc动态内存分配函数2.1malloc函数基本情况2.2调试观察calloc函数三,realloc函数3.1realloc函数的由来3.2realloc的基础知识3.3realloc函数代码实现四,柔性数组前言:我们知道,对于C/C++程序内存分配来说:大致可以分为三个大区:栈区,堆区,静https://blog.csdn.net/qq_52777887/article/details/122814866?spm=1001.2014.3001.5501
三,C++动态内存管理
那么对于C++中动态内存管理,首先我们需要知道的是,C++是兼容C语言的,所以 malloc 一类的函数是可以在C++中使用的,但是因为考虑到一些只要C++中才能使用的影响因素,在C++中一般我们会使用 new/delete 来开辟和释放空间。
3.1new/delete 和 mallc/free 的区别
对于内置类型的区别
那么首先,我们需要分析一下对于内置类型,他们的区别在哪里。如下图所示:
我们看到,首先对于内置类型的动态内存开辟和释放两种方式基本是没有区别的。
但是其实对于多个空间的开辟与释放,new 和 delete 都是通过 [ ] 来实现的。这个是需要注意的,其次对于多个空间的初始化,new 只需要在括号后面家函数加上 { },然后进行初始化即可。
对于自定义类型的区别
那么对于自定义类型来说其实是一样的,不过有区别的是 new 会在为自定义类型开辟空间时,自动调用构造函数去初始化它,而 malloc 则不会,这就是区别。
其次,在释放空间时,对于自定义类型,对应的 delete 会自动调用析构函数,而 free 函数则不会调用。
也就是说,我们在使用自定义类型对象时,我们首先需要在使用之前初始化它,接着如果我们在初始化或者使用的时候使用了new等在堆上开辟了空间,这时候就会调用释放函数去释放它。
而现在不需要了,new/delete 会自动调用初始化和析构函数去帮我们实现初始化和释放操作。
异常处理机制不同
那么对于他们的不同,还有一个比较重要的地方,那就是异常处理。
malloc 在申请空间失败时,我们一般会采用一个强制退出的函数,并且打印出一个申请失败的字样,表示空间申请失败。但是我们发现,在C++中,这样的处理机制我们并不喜欢,因为C++是一门面向对象的语言,既然是面向对象,那么C++中就提出了 new 来开辟空间,一旦失败,它会使用 try catch 语句抛出异常,此时我们就能看到那为什么出错的一个信息。
这也是 new 和 malloc 的一个不同之处。
3.2底层调用
上面我们看了两种开空间方式的不同,显然来说,C++中使用 new 和 delete 是比较好的,因为他们会自动调用构造函数和析构函数。
如上图所示,其实从底层上来说,new 是通过调用全局函数 operator new 来开辟空间的,而 delete 是通过调用全局函数 operator delete 来释放空间的。
同时,对于全局函数 operator new 来说,其实它是通过 malloc 来申请空间的,不过它在申请空间失败时,会进行抛异常的操作。而同样的,operator delete 函数也是通过 free 来释放空间的,不过一般释放空间是不会出错的,如果有错的话,那么一定是野指针或者非法内存访问
四,内存泄露
好的,那么经过上面的了解。对于C++的基本内存管理,我们已经有了一个基本清晰的认知。
但是同时我们知道,既然有内存空间的开辟,那么我们有理由相信有时候我们会忘记释放,从而导致出现内存泄漏。
4.1什么是内存泄露?
所谓内存泄漏,就是因为不小心或者错误导致未释放不再使用的空间的情况。但是内存泄漏并不表示内存消失不见,而是因为我们的错误,导致这段内存不能再被使用,如此往复的话,有可能导致内存浪费越来越多,最后因为可用内存不足,导致系统崩溃。
4.2内存泄漏的几种情况
1.如果出现内存泄漏的进程正常结束,这些内存会在进程结束之后,自动归还给操作系统,这样的进程一旦出现内存泄漏也是没关系的。
2.如果出现内存泄漏的进程异常结束,这些内存则不会在结束时候还给操作系统,那么长此以往,就会导致操作系统宕机,出现不可挽回的损失。
3.如果需要长期运行的程序出现内存泄漏,短时间内是没问题的,如果时间长了之后,系统空间越来越少,最后也会导致操作系统直接宕机,损失同样是很大的。
所以,在以后的工作中一定不能忘记释放内存呀!
好的,那么对于C++的内存管理到这里就结束啦!如果觉得不错,还请各位大佬给个支持鸭!