2.2、vector如何释放空间
vector内存分配特性:只增不减
vector在扩容时会分配更大的连续内存空间,capacity
(容量)会增加,但当执行元素删除操作(如erase
或clear
)时:
- •
size
(元素数量)减少,但capacity
(总分配内存)不会自动缩小,已分配的内存仍然被保留,不会主动释放。
clear()
和erase()
的作用边界
- •
clear()
:销毁所有元素,使size
变为0
,但不改变capacity
,内存仍被占用。 - •
erase()
:删除部分元素,仅改变size
,同样不释放内存。
内存真正释放的时机
vector所占用的内存仅在析构时被系统回收,即:
- • 当vector对象生命周期结束时(如离开作用域、被显式销毁),调用析构函数释放底层内存。
主动释放内存的技巧
1. 完全释放内存(清空vector)
借助swap
技巧,将目标vector与空临时vector交换,触发内存释放:
// 方法一:创建空临时对象交换
std::vector<T> emptyVec;
emptyVec.swap(vec); // vec的内存转移到emptyVec,后者析构时释放
// 方法二:更简洁的临时对象写法
std::vector<T>().swap(vec); // 匿名临时对象析构时释放内存
2. 部分缩减容量(保留元素,释放多余预留空间)
通过拷贝构造当前vector并交换,使capacity
等于size
:
std::vector<T>(vec).swap(vec); // 临时vector的capacity为当前size,交换后释放原多余空间
注意事项
- 1. 指针元素的内存管理:
若vector中存储的是指针,swap
或clear
只会释放vector自身内存,不会自动delete
指针指向的对象,需手动释放。 - 2. 类析构函数中的风险:
不建议在类析构函数中直接调用swap
释放成员vector内存,可能因重复释放(double free)导致程序崩溃。
总结
- • vector的内存释放依赖析构函数,
clear
和erase
不影响capacity
。 - • 主动释放内存需通过
swap
技巧:与空vector交换可完全释放内存,与拷贝vector交换可缩减容量。 - • 理解内存释放机制对控制程序内存占用、避免内存泄漏及性能优化至关重要。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1797
文章版权归作者所有,未经允许请勿转载。
THE END