一、内存分配
内存分配 | 生命周期 | 申请效率 | 申请大小 | |
栈 | 函数调用时操作系统自动分配 | 和函数一起创建和销毁 | 由系统分配,速度快 | 大小受限(栈是向低地址扩展的大小固定的连续内存区域) |
堆 | 动态分配,使用new和delete关键字 | 程序员手动管理 | new分配的,速度慢,容易产生内存碎片,存在内存泄漏风险 | 和计算机系统中的有效虚拟内存有关(堆是向高地址扩展的不连续的内存区域)和链表的从低到高寻址和不连续性有关 |
静态存储区分配 | 在程序编译前完成,在程序的整个运行期间都存在; 如全局变量、静态变量 | 寿命等于整个程序 |
二、内存管理
指针 | 访问内存地址,跟踪动态分配的对象 | |
引用 | 间接引用,提供对象别名;不单独存放地址,无内存管理任务 | |
内存泄漏 | 动态分配的内存没有正确释放,导致内存变少 | |
智能指针 | 自动管理内存,简化并避免手动删除操作引发的问题,如unique_ptr、shared_ptr、weak_ptr,C++11引入的 | |
内存对齐 | 为优化性能,编程语言会对变量存储位置进行对齐,遵循特定的对齐大小规则 | |
内存碎片 | 频繁的分配释放内存导致的内存被分割成小块 | |
内存池 | 预先分配大量内存,按需分配和回收,减少频繁分配回收内存的开销 | |
异常安全 | 确保即使在处理异常时也能正确释放内存,避免内存泄漏 |