当前位置: 首页 > 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文件中某一音轨的音乐数据
  • 国铁集团郑州局预计“五一”发送642.5万人
  • 国有六大行一季度合计净赚超3444亿,不良贷款余额均上升
  • 发挥全国劳模示范引领作用,加速汽车产业电智化转型
  • 俄宣布停火三天,外交部:希望各方继续通过对话谈判解决危机
  • 湖南华容县通报“大垱湖水质受污染”,爆料者:现场已在灌清水
  • 西班牙葡萄牙遭遇史上最严重停电:交通瘫了,通信崩了,民众疯抢物资