您的位置:首页 > 科技 > 能源 > C++的内存分布

C++的内存分布

2024/9/21 18:39:34 来源:https://blog.csdn.net/2401_82644627/article/details/142284191  浏览:    关键词:C++的内存分布

我们之前应该讲过C语言的内存分布,一些基础的东西,其实这里也只要掌握一些基础的东西就足够了,我们看一张图片,

这一张图很清晰的表述了我们的简单内存管理,我们的静态数据是放在数据段的,申请的空间是在堆上的。这些是一些基础的东西,那么我们就由则这些基础的知识来做一道题目。

大家认真看一看,是不是变量在栈,指针也在栈,常量在代码段,开辟的空间在堆上。这句话就是上面的题目想要表达的意思。

C++的内存管理方式

大家都知道C的内存分配是malloc/realloc/calloc/free来分配空间的,这些在C++里面依然适用,但是C++自己又设计了一套,我们看看。

new/delete操作内置类型

new是开辟空间的,delete是释放空间的,其实和C语言里面有点像,也是开辟空间和释放空间。但是C++的这种好用些,方便些。我们用一段代码看看到底怎么用。

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用


 new和delete操作自定义类型

我们看一段代码。

这就是C和C++的区别。C++的new和delete会调用构造函数和析构函数,但是malloc不行。这就是区别,当然内置类型也是一样的。 

operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

其实,operator new就是通过malloc来实现的,operator delete就是通过free来实现的。

new和delete的实现原理

内置类型:

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是: new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

自定义类型:

new的原理:

1. 调用operator new函数申请空间

2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理:

1. 在空间上执行析构函数,完成对象中资源的清理工作

2. 调用operator delete函数释放对象的空间

new T[N]的原理:

1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请。

2. 在申请的空间上执行N次构造函数

new[ ]delete的原理:

1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理

2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

malloc/free和new/delete的区别

相同点是都需要从堆上申请,并且需要手动释放,区别是:

1.malloc和free是函数,但是new和delete是操作符;

2.malloc申请空间不会初始化,但是new会调用构造函数进行初始化;

3.malloc申请空间必须要指定需要多少个这样的空间,但是new不用,只需带上类型就可以,申请多个就只要加上[ ],里面写要多少个就行。

4.malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型;

5.malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常;

6.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理释放。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com