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

【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
http://www.xdnf.cn/news/1415.html

相关文章:

  • 2025/4/23 心得
  • 视频图片去水印处理图像 HitPaw Watermark Remover 软件工具WIN
  • MacOS中安装Python(homebrew,pyenv)
  • Java实现插入排序算法
  • 杭电oj(1087、1203、1003)题解
  • 云原生--CNCF-3-核心工具介绍(容器和编排、服务网格和通信、监控和日志、运行时和资源管理,安全和存储、CI/CD等)
  • gtest、gmock的使用
  • Google搜索技巧
  • 【官方正版,永久免费】Adobe Camera Raw 17.2 win/Mac版本 配合Adobe22-25系列软
  • 若依项目部署小结
  • OSPF的优化
  • 进程(Process)详解
  • 【自然语言处理与大模型】大模型参数规模与部署配置调查2025第一季度
  • LSA六种类型
  • VScode
  • 5.3 分布式事务
  • git lfs下载大文件限额
  • 查询Hologres或postgresql中的数据
  • php基础
  • 算法训练营第一天|704.二分查找、27.移除元素、977.有序数组的平方
  • 集结号海螺捕鱼组件搭建教程与源码结构详解(第四篇)
  • crictl 拉取镜像报错 Unimplemented desc = unknown service runtime.v1.ImageService
  • redis 使用 Docker 部署 简单的Redis 集群(包括哨兵机制)
  • 修电脑之电脑没有声音
  • 武装Burp Suite工具:xia SQL自动化测试_插件
  • date-picker组件的shortcuts为什么不能配置在vue的data的return中
  • 小红书文字配图平替工具
  • Vue3-原始值的响应式方案ref
  • 实时数仓体系概览与架构演进
  • python实战项目64:selenium采集软科中国大学排名数据