C++内存分布&malloc-free-new-delete的区别和联系

内存管理:从堆栈到new/delete的理解
文章详细阐述了内存的分布,包括bss和data段的区别,堆和栈的特性以及内存分配函数malloc、free与C++的new、delete操作符的异同。new/delete不仅分配内存,还会调用构造和析构函数,提供更好的对象管理。

目录

一、内存分布

1.1内存分布图:

 1.2 为什么要将bss和data区分开呢?

1.3 堆和栈有什么区别

 二、malloc、free;new、delete

2.1  new和delete是如何实现的,new与malloc的异同处

2.2既然有了malloc/free,C++为什么还需要new/delete


一、内存分布

1.1内存分布图:

 1.2 为什么要将bss和data区分开呢?

在程序编译的时候,不会给.bss段中的数据分配空间,只是记录数据所需空间的大小。在程序执行的时候,才会给.bss段中的数据分配内存。通过这种方式,可以节省一部分内存空间,进一步缩减可执行程序的大小。

1.3 堆和栈有什么区别

堆是由malloc和new动态开辟的一段内存,由程序员自己管理和释放。栈则是由编译器自己开辟和管理的内存,一般用来存放函数的传参和局部变量。

空间由于频繁开辟和释放,所以会产生内存碎片的问题。

堆的生长空间向上,地址越来越大,栈则是向下,地址越来越小。栈的空间很小只有8M,而堆有4G。

 二、malloc、free;new、delete

2.1  new和delete是如何实现的,new与malloc的异同处

new和delete是对malloc和free的封装,new一个对象时,会首先调用malloc分配空间,然后执行对象的构造函数初始化这块空间,delete则会先调用对象的析构函数,然后调用free释放这块空间。

他们最大的区别则是 1、new会调用构造函数初始化空间。2、new并不需要指定资源的大小。3、new的返回值是对象类型的指针,而malloc则是void * 的指针。4、new如果调用失败,则会抛异常,而malloc调用失败则会返回NULL。5、new是一个操作符,malloc则是函数,operator new可以被重载。

2.2既然有了malloc/free,C++为什么还需要new/delete

这四个函数都是用来申请和释放内存。new/delete主要是对malloc/free进行了封装,使其能更好地申请和释放C++的对象资源,否则就得malloc一块空间,然后手动调用构造函数。

而malloc/free是已经编译好的库函数,其还要兼容C语言,不能够轻易修改,所以将其封装起来实现了new/delete。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值