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)。

相关推荐
明月看潮生16 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
cuisidong199719 分钟前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
南宫理的日知录27 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
逊嘘43 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
van叶~1 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
Half-up1 小时前
C语言心型代码解析
c语言·开发语言
knighthood20011 小时前
解决:ros进行gazebo仿真,rviz没有显示传感器数据
c++·ubuntu·ros
Source.Liu1 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust