在c++中 , 内存是一个核心的概念 , 因为它关系到程序如何存储和访问数据 , 其中c++内存可以分为以下几个部分
1.栈 (stack)
- 栈是一个存储局部变量和函数调用信息的内存区域
- 当一个函数被调用的时候,它的局部信息和一些执行信息被压入栈中。当函数执行完毕,这些信息又会出栈
- 栈内存 的分配和释放都是自动的,又编译器控制
2. 堆(heap)
- 堆是用于动态内存分配的内存区域
- 开发者可以使用 new操作符在堆上分配内存, 使用delete操作符来释放内存
- 堆的内存管理都是手动的 , 需要程序员手动分配和释放
3.静态、全局存储(static/gobal storage)
- 静态存储用于全局变量,静态变量和常量
- 这部分在程序启动时分配,程序结束时释放
4. 常量存储区
- 常量字符串和其他常量数据存储这个区域
- 这些内存通常是只读的
5.代码区
- 存储程序的二进制代码
6. 内存分配方式
6.1 静态内存分配(static memory allocation)
- 内存分配在编译时确定,不会在运行时改变
- 包括全局变量 静态变量(static)和局部静态变量
- 一旦分配,内存大小在整个程序运行期间都保持不变
6.1 动态内存分配(dynamic memory allocation)
- 在程序运行时进行分配
- 使用new 和delate(或者malloc 和free在c语言中) 来管理
- 动态内存分配允许程序根据需要分配任意大小的内存,但增加了复杂性,因此需要手动管理内存的生命周期
7.总结 以及常见问题
- 理解c++ 内存管理的关键是要认识到不同类型的内存有不同的生命周期和管理方式, 静态内存是自动管理的,而动态内存是需要开发者手动进行分配和释放,不当的内存管理会导致内存泄漏或者程序崩溃 。
8.什么是内存泄漏和溢出,如何检测和避免
-
内存泄漏主要是指程序中已经分配的堆内存由于疏忽或者错误而未被释放或无法释放,从而导致内存不再使用原来那部分的内存, 随着程序的运行时间的增长,泄漏的内存会逐渐增加,最终可能导致程序运行缓慢或者崩溃
检测的方法: -
检查代码再堆区开辟的内存有没有正确的释放,以及指针知否置空
-
日志和监控:在代码中添加适当 的日志记录内存分配和释放行为,监控内存使用的增长趋势
避免策略 -
使用智能指针 :std::unique_ptr , std::shared_ptr 来管理内存
-
及时释放内存:确保每次new操作后都有对应的delete操作