五、内存管理
约 1378 字大约 5 分钟
2026-05-11
C++内存分区,堆和栈的区别
栈:适合存储生命周期较短,大小固定的对象,编译器自动分配释放,优点是高效且安全,但空间小
堆:适合存储生命周期较长,大小动态变化的对象,动态分配内存区域,由程序员手动管理,使用时要谨慎管理内存,空间大,但管理复杂,容易内存泄漏
BSS段:未初始化的静态常量,全局变量
数据段:已初始化的静态常量,全局变量
代码段:存储程序的机器指令(函数体),只读。

new和malloc的区别是什么?
new和malloc的区别体现在:
new是c++的运算符,malloc是c的库函数,new不仅分配内存,还会调用构造函数,new分配失败会抛出异常,malloc分配失败返回NULL,new用delete释放,malloc用free释放。
new和malloc的区别是什么?
free是C语言的函数,配套malloc使用,不使用析构函数
delete是c++的操作符,配套new使用,同时调用析构函数
在c++中placement new 的作用
Placement new 是 C++ 中一种特殊的 new 表达式,它允许在已分配的内存上构造对象。
它不分配内存,只负责调用对象的构造函数来初始化指定的内存位置,这用于需要精确控制对象内存布局和生命周期的场景,如自定义内存池、高性能计算和避免内存碎片。
在c++中placement new 的作用
内存泄漏 是指程序申请了一块内存但忘记释放,就像借了钱却没还,时间一长占用越来越多资源。
野指针 是指一个指针指向了一块已经失效的内存,比如你用一把废掉的钥匙去开门,可能会引起程序崩溃。
内存越界 是访问了数组或内存的非法位置,相当于你住 101 室,却跑去 110 室开门,结果不是你家,还可能触发异常。
这三类问题都很危险,处理不好会导致程序崩溃、卡顿甚至系统漏洞。
如何避免 内存泄漏,手动释放,如果是C++可以使用智能指针。
野指针,可以进行初始化nullptr,释放后置为nullptr,避免返回局部变量的地址。
内存越界,严格检查数据的边界,使用std::vector,开启地址检查工具。
在c++中placement new 的作用
内存泄漏 是指程序申请了一块内存但忘记释放,就像借了钱却没还,时间一长占用越来越多资源。
野指针 是指一个指针指向了一块已经失效的内存,比如你用一把废掉的钥匙去开门,可能会引起程序崩溃。
内存越界 是访问了数组或内存的非法位置,相当于你住 101 室,却跑去 110 室开门,结果不是你家,还可能触发异常。
这三类问题都很危险,处理不好会导致程序崩溃、卡顿甚至系统漏洞。
如何避免 内存泄漏,手动释放,如果是C++可以使用智能指针。
野指针,可以进行初始化nullptr,释放后置为nullptr,避免返回局部变量的地址。
内存越界,严格检查数据的边界,使用std::vector,开启地址检查工具。
内存碎片的概念及栈溢出与堆溢出的区别
内存碎片是内存管理中未被使用的空闲内存由于太小而无法被有效利用的现象,分为外部碎片(分散的小块空闲内存)和内部碎片(分配出去但未被使用的内存)。
栈溢出是指当程序调用栈深度(如无限递归)或局部变量大小超过栈内存区域容量时发生的错误,是一种容量不足的错误。
堆溢出是指程序在动态分配的内存块(堆)之外进行读写操作,破坏了堆的管理结构或其他数据,是一种越界访问的错误,常导致安全漏洞
如何避免内存碎片
避免内存碎片的核心策略是减少不同生命周期、不同大小内存块的交替申请与释放。
主要手段包括:使用内存池进行小对象的高频次分配;
优先使用stdstring等STL容器而非裸指针,预分配大块内存并就地构造对象,以及谨慎使用智能指针管理所有权
