C++内存的一些知识点

一、内存分区

在C++中,内存主要分为以下几个区域:

代码区:存放函数体的二进制代码。

全局/静态存储区:存放全局变量和静态变量,这些变量在程序的整个运行期间都存在。
常量存储区:存放常量,这些值在程序编译时就已经确定,并且在程序的整个运行期间都不可修改。
栈区(Stack):
管理方式:由编译器自动管理,无需手动控制。
用途:用于存储局部变量、函数参数等。当函数被调用时,其所需变量在栈上分配空间,函数结束时自动释放这些空间。
特点:栈的大小有限,通常由编译器在编译时确定;栈上内存的分配和释放速度非常快,因为它采用了后进先出(LIFO)的原则,内存的分配和释放都通过移动栈指针完成。
堆区(Heap):
管理方式:由程序员手动管理,通过new/delete(C++)或malloc/free(C及C++兼容)等函数进行内存的分配和释放。
用途:用于存储动态分配的对象、数据结构等。堆上的内存可以在程序的任何地方访问,包括函数之间。
特点:堆的大小通常比栈大,且可以动态增长或缩小;堆上内存的分配和释放相对较慢,因为需要进行动态内存管理和寻找可用内存空间的过程;频繁的new/delete操作可能导致内存碎片。

二、内存泄漏

定义:内存泄漏是指程序在运行过程中未能正确释放不再使用的内存,导致这些内存无法被重新使用,从而造成内存资源的浪费。

常见原因:

忘记释放内存:对于使用new或malloc等函数动态分配的内存,如果忘记使用delete或free释放,就会导致内存泄漏。

多次new而仅释放一次:当对同一个对象多次使用new进行内存分配时,需要匹配同样数量的delete进行释放,否则也会导致内存泄漏。

循环引用:两个或多个对象相互引用时,如果没有正确处理引用关系,就可能导致内存无法被释放。
避免方法:

使用栈上分配:尽可能在栈上分配对象,栈上的对象会在作用域结束时自动释放。
使用智能指针:C++11及以后的版本提供了智能指针(如std::shared_ptr、std::unique_ptr)来自动管理动态分配的内存。
定期检查和测试代码:通过代码审查和测试来发现潜在的内存泄漏问题。

三、内存对齐

定义:内存对齐是指编译器在分配和排列内存时,按照特定规则将数据对齐到特定的边界上。

目的:

提高程序性能:CPU访问对齐的内存时效率更高,因为可以减少内存访问的次数和缓存的命中率。
提高可移植性:不同的硬件平台对内存对齐的要求可能不同,合理的内存对齐可以提高代码在不同平台上的可移植性。
对齐规则:

每个类型都有一个对齐边界,即数据应该对齐到的最小内存单元。

结构体、类和联合中的数据成员按照它们自身的对齐要求进行对齐。

编译器可能会在成员之间或对象之前/之后添加填充字节以保证对齐。

四、内存分配与释放

堆内存分配:

使用new或malloc等函数进行动态内存分配。

分配的内存大小由程序员指定。

栈内存释放:

使用delete或free等函数释放动态分配的内存。

释放内存后,指针变为悬空指针,应避免再次使用。

注意事项:

确保在不再使用动态分配的内存时及时释放它。

避免使用已经释放的内存(悬空指针)。

注意内存分配和释放的匹配性(如new与delete、malloc与free)。

相关推荐
量子-Alex6 分钟前
【多模态聚类】用于无标记视频自监督学习的多模态聚类网络
学习·音视频·聚类
轻口味8 分钟前
命名空间与模块化概述
开发语言·前端·javascript
吉大一菜鸡11 分钟前
FPGA学习(基于小梅哥Xilinx FPGA)学习笔记
笔记·学习·fpga开发
晓纪同学1 小时前
QT-简单视觉框架代码
开发语言·qt
威桑1 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服1 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans1 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手1 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#