C++内存管理相关知识

本文介绍了C++中内存区域的划分,包括栈区、堆区、数据段和代码段的特点。重点讲解了动态内存管理的new和delete与C语言malloc和free的区别,以及它们在自定义类型上的构造/析构函数调用。
摘要由CSDN通过智能技术生成

首先,要了解该如何使用C++来进行内存的管理,我们需要了解C++中内存区域的划分

C++内存区域的划分:

C++中的内存主要分为四个区域,分别是栈区、堆区、数据段以及代码段。

栈区:用来存储局部变量,函数的参数和返回值等,栈区的内存很小,通常只有几MB,在程序运行过程中自动分配与释放空间

堆区:用于动态内存分配,malloc等内存申请函数申请的就是堆区的内存,堆区是一个大容器,具有较大空间,在32位环境下最多可有2G空间,而在64位环境下可以认为是拥有无限内存可供分配。堆区的空间需由程序员手动分配与释放,若程序员没有释放申请的空间,在程序结束后由操作系统自动释放。

数据段:也被称为静态区,用于存储全局变量和静态变量。数据段有可分为date(主要用来存放已经初始化的数据)区和bss区(主要用来存放未经初始化的数据)

代码段:又被称为常量区,用于存储程序员写的被转化为二进制的CPU可执行的代码和一些如用const修饰的常量数据。代码段存储的数据具有只读属性,不能随意更改。

管理内存的方式

C语言中动态管理内存的方式是通过malloc、calloc、realloc和free来完成,而C++中则是使用new和delete进行内存的管理,两者的区别在于:malloc、calloc属于函数的范畴,而new和delete则是属于关键字的范畴,下面是一段示例代码

new和delete相对于malloc和free的优点

那么,为什么有了malloc和free等函数后,C++还要搞出个new和delete呢,关键就在于,对于自定义类型,在使用new申请空间后,编译器会自动调用该类型的构造函数,对申请的空间进行初始化,同样,对于自定义类型,在使用delete释放空间时,编译器会首先调用自定义类型的析构函数,再对空间进行释放。

operator new 和operator delete

operator new 申请空间的用法和malloc其实是一模一样的,二者的区别在于:malloc在申请空间失败后,会return 0,而哦、operator new在开辟内存失败后则会抛异常。而operator new和free二者则完全相同,在释放空间失败后,都会导致程序终止。

new的原理:1、调用operator new 函数来申请一段空间  2、调用构造函数,对申请的空间进行初始化;

delete的原理:1、调用析构函数  2、调用operator delete函数对申请的空间进行释放;

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值