2.2、vector如何释放空间

vector内存分配特性:只增不减

vector在扩容时会分配更大的连续内存空间,capacity(容量)会增加,但当执行元素删除操作(如eraseclear)时:

  • • 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. 1. 指针元素的内存管理
    若vector中存储的是指针,swapclear只会释放vector自身内存,不会自动delete指针指向的对象,需手动释放。
  2. 2. 类析构函数中的风险
    不建议在类析构函数中直接调用swap释放成员vector内存,可能因重复释放(double free)导致程序崩溃。

总结

  • • vector的内存释放依赖析构函数clearerase不影响capacity
  • • 主动释放内存需通过swap技巧:与空vector交换可完全释放内存,与拷贝vector交换可缩减容量。
  • • 理解内存释放机制对控制程序内存占用、避免内存泄漏及性能优化至关重要。
    本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
    (加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
THE END