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

相关推荐
先生沉默先43 分钟前
Nginx 反向代理学习:单端口统一访问多服务
学习·nginx·arcgis
爱吃烤鸡翅的酸菜鱼1 小时前
Spring Boot 实现 WebSocket 实时通信:从原理到生产级实战
java·开发语言·spring boot·后端·websocket·spring
雪域迷影1 小时前
C++中编写UT单元测试用例时如何mock非虚函数?
开发语言·c++·测试用例·gmock·cpp-stub开源项目
AI街潜水的八角2 小时前
Python电脑屏幕&摄像头录制软件(提供源代码)
开发语言·python
hadage2332 小时前
--- git 的一些使用 ---
开发语言·git·python
LFly_ice3 小时前
学习React-24-路由传参
前端·学习·react.js
陈天伟教授4 小时前
基于学习的人工智能(3)机器学习基本框架
人工智能·学习·机器学习·知识图谱
毕设源码-钟学长4 小时前
【开题答辩全过程】以 高校课程学习评价系统设计与实现为例,包含答辩的问题和答案
学习
lly2024064 小时前
HTML与CSS:构建网页的基石
开发语言
一只会写代码的猫4 小时前
面向高性能计算与网络服务的C++微内核架构设计与多线程优化实践探索与经验分享
java·开发语言·jvm