C++内存分布

C/C++内存分布:

在语言层面上:

内存自底向上地址从低到高大致分布为:

代码段(代码编译后程序指令、常量等)

数据段(全局数据,静态数据)

堆(向上增长,动态开辟)

内存映射段或叫共享区(动态库、映射、共享内存等)

栈(向下增长)

内核区(系统内核使用的内存空间)

operator new 和operator delete

一、operator new 和operator delete是系统提供的全局函数,new和delete在底层是通过调用这两个全局函数来申请和释放空间的
二、operator new 的底层是malloc,若malloc申请空间成功则返回首地址,否则抛异常
三、operator delete 的底层是free

new和delete的实现原理

通过这个图我们可以看到,new和delete都是将C接口封装进行调用。

对于内置类型:

一、如果申请释放的是内置类型的空间,那么和malloc / free类似
二、new / delete 申请释放的是单个元素的空间 , new[ ] / delete[ ]申请释放的是连续的空间
三、malloc申请失败会返回NULL,而new申请失败则会抛异常

对于自定义类型

new的原理

  • 图中描绘得很清楚,调用operator new申请空间
  • 在申请的空间上调用构造函数,完成对象的初始化。

delete的原理

  • 在空间上执行析构函数,完成对象中资源的清理工作
  • 调用operator delete释放对象空间

new T[N]的原理

  • 调用operator new[ ],在operator new[ ]函数中调用operator new完成N个对象的空间申请
  • 在申请的空间上执行N次构造函数

delete T[N]的原理

  • 在空间上执行N次析构函数,完成N个对象的资源释放
  • 调用operator delete[ ]函数,在operator delete[ ]函数中调用operator delete函数完成N个对象的空间释放

定位new表达式

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

使用格式

new(place_address ) type 例如:new(ptr)string

new(place_addresstype (init)例如:nwe(ptr)string("hello world")

常见问题

malloc/free和new/delete的区别

共同点

都是从堆上申请空间,并且需要用户手动释放

不同点

一、malloc和free是函数,

new和delete是操作符
二、malloc申请的空间不会初始化,

new的空间会初始化
三、malloc申请空间时,需要手动计算大小并传递,

new只需要在其后面跟上申请空间的类型即可
四、malloc的返回值是void*, 在使用时,必须强转,

new不需要,因为new在申请时已经传了类型
五、malloc在申请失败时返回NULL,因此使用时必须判空,

new失败会抛异常
六、申请自定义类型时,malloc/free只会申请和释放空间,而new/delete会在申请释放时,调用构造和析构,完成对象的初始化和清理资源

内存泄漏

内存泄漏是指没有释放已经不再使用的内存的情况

内存泄漏并不是指内存在物理上消失了,而是说应用程序分配某段内存后,因为设计失误或错误,失去了对该内存的控制,导致内存的浪费

内存泄漏的危害

长期运行的程序出现内存泄漏,可能会卡死

内存泄漏的分类

堆内存泄漏

程序通过malloc/calloc/realloc/new等从堆中分配的内存,用完没有释放,导致这部分内存无法在被使用

系统资源泄漏

指程序使用系统分配的资源,比如套接字,文件描述符,管道等,然后没有释放,导致资源浪费,严重可导致系统性能降低,系统执行不稳定

如何避免内存泄漏

  • 良好的设计规范,申请的空间对应匹配就释放
  • 采用RAII(资源获取即初始化)思想或智能指针来管理内存

(拓展)

如何一次性在堆上申请4G内存

在32位平台下无法操作,因为32位平台内存整个就4G,堆空间无法达到4G

在64位下就可以申请4G内存了

相关推荐
学游戏开发的几秒前
UE求职Demo开发日志#19 给物品找图标,实现装备增加属性,背包栏UI显示装备
c++·笔记·游戏引擎·unreal engine
c-c-developer1 小时前
C++ Primer 标准库类型string
开发语言·c++
宁静致远20212 小时前
Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成
c++·vscode·ubuntu
Bluesonli2 小时前
第 2 天:创建你的第一个 UE5 C++ 项目!
c++·学习·ue5·虚幻·虚幻引擎·unreal engine
比特在路上2 小时前
蓝桥杯之c++入门(四)【循环】
c++·职场和发展·蓝桥杯
pay顿2 小时前
C++基础day1
c++·学习·笔试
孤寂码农_defector2 小时前
C++【iostream】数据库的部分函数功能介绍
c++
Icomi_3 小时前
【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙
c语言·c++·人工智能·pytorch·python·机器学习·计算机视觉
余辉zmh3 小时前
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(二)
c++·算法·leetcode·贪心算法
余辉zmh3 小时前
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)
c++·算法·leetcode·贪心算法