当前位置: 首页 > news >正文

【C++】vector扩容缩容

vector扩容缩容

1 扩容

一般来说,主要是重新分配内存

2 缩容

resize 缩小后,vector 的容量(capacity())可能保持不变,需要显式调用 shrink_to_fit() 来释放内存。

验证代码:

#include <vector>
#include <iostream>template <typename T>
class TrackingAllocator {
public:using value_type = T;TrackingAllocator() = default;// 允许从其他类型的 TrackingAllocator 构造template <typename U>TrackingAllocator(const TrackingAllocator<U>&) {}// 分配内存T* allocate(size_t n) {std::cout << "分配 " << n * sizeof(T) << " 字节" << std::endl;return static_cast<T*>(::operator new(n * sizeof(T)));}// 释放内存void deallocate(T* p, size_t n) {std::cout << "释放 " << n * sizeof(T) << " 字节" << std::endl;::operator delete(p);}// 定义相等比较运算符bool operator==(const TrackingAllocator&) const noexcept {return true; // 无状态分配器,所有实例等价}// 定义不等比较运算符(可选,C++20 前需要)bool operator!=(const TrackingAllocator& other) const noexcept {return !(*this == other);}
};int main() {// 使用自定义分配器的 vectorstd::vector<int, TrackingAllocator<int>> vec;// 测试 resize 缩小是否释放内存vec.resize(1000);  // 触发分配std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;vec.resize(10);    // 缩小 size,但 capacity 不变std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;vec.shrink_to_fit(); // 显式释放多余内存std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;return 0;
}

测试不同标准库实现的行为:

编译器/库resize 缩小是否自动释放内存
GCC (libstdc++)否,需 shrink_to_fit
Clang (libc++)否,需 shrink_to_fit
MSVC (MSVC STL)否,需 shrink_to_fit

注意:gcc使用shrink_to_fit时,会重新分配空间

检测是否有内存泄漏:

valgrind --tool=memcheck --leak-check=full ./your_program

相关文章:

  • 量化价值投资的SWOT分析:从传统投资到量化策略的转型
  • 基础算法合集-二分查找(三种写法)
  • 智能指针(shared_ptr)之二
  • 新手村:正则化
  • 高防IP是什么
  • Linux——进程优先级/切换/调度
  • LeetCode算法题(Go语言实现)_58
  • Linux系统编程---精灵进程与守护进程
  • 基于 Vue 2 开发的分页卡片列表组件(带懒加载和点击事件)
  • 对流对象的理解
  • 知识储备-DC综合相关
  • 新手村:过拟合(Overfitting)
  • # 深度学习中的学习率调度:以 PyTorch 图像分类为例
  • Java 开发瓶颈破局:飞算 JavaAI 如何一站式生成标准化项目结构?
  • 云贝餐饮 最新 V3 独立连锁版 全开源 多端源码 VUE 可二开
  • C++面向对象特性之继承篇
  • 生物计算安全攻防战:从DNA存储破译到碳基芯片防御体系重构
  • PowerQuery汇总整个文件夹中的数据
  • DC-2寻找Flag1、2、3、4、5,wpscan爆破、git提权
  • python:mido 提取 midi文件中某一音轨的音乐数据
  • 三亚亚龙湾3.4公里岸线近岸海域使用权挂牌出让,起始价近九千万
  • 大理洱源4.8级地震致442户房屋受损,无人员伤亡
  • 股市劝服马斯克
  • 中海宏洋集团4.17亿元竞得浙江绍兴宅地,溢价率20.87%
  • 上海市长会见璞跃全球创始人亚美迪,建设国际AI创新创业网络中心节点
  • 印控克什米尔地区发生针对游客枪击事件,造成至少25人丧生