news 2026/4/26 1:31:10

【std::vector】复制后size、capacity

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【std::vector】复制后size、capacity

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
      • 一、v1的size是否为2?
      • 二、原来的五个元素占据的空间会自动释放吗?
        • 1. 元素对象的销毁:立即发生
        • 2. 底层内存的释放:不一定立即发生(但会被管理)
      • 三、是否有内存泄漏风险?
      • 补充:验证代码
      • 总结

前言

vector<int>v1={1,2,3,4,5};vector<int>v2={5,6};v1=v2;

经过这个拷贝之后v1的size是2吗,原来那五个元素占据的空间会自动释放吗,有什么内存泄漏风险没有


要解答这个问题,我们需要从C++ vector的赋值运算符行为内存管理机制内存泄漏的定义三个层面分析。

一、v1的size是否为2?

vector的赋值运算符(operator=)的核心语义是替换容器的内容

  1. 销毁当前vector中所有已存在的元素(对于int这类内置类型,析构是空操作);
  2. 分配足够的内存(如果当前capacity不足),将右操作数(v2)的元素逐份拷贝到当前vector中;
  3. 调整当前vector的size为右操作数的size(即v2的size=2),capacity则根据实现可能保留原有空间(后续详解)。

因此,赋值后v1.size()的结果是2,元素为{5,6}

二、原来的五个元素占据的空间会自动释放吗?

分两种情况:元素对象的销毁 vs 底层内存的释放

1. 元素对象的销毁:立即发生

原来的5个int元素会被立即销毁(内置类型的析构是空操作,但逻辑上这些元素已被清理)。如果vector中存储的是自定义类型对象,这些对象的析构函数会被调用,对象持有的资源(如堆内存、文件句柄)会被释放。

2. 底层内存的释放:不一定立即发生(但会被管理)

vector的底层是动态分配的连续数组(堆内存),这部分内存的释放规则是:

  • 赋值时,如果v1的当前capacity ≥ v2的size(比如v1原来的capacity=5,v2的size=2),vector为了性能优化(避免频繁的内存分配/释放),会保留原有底层内存,不会立即释放多余的空间(即capacity仍可能是5)。
  • 这些未释放的内存属于vector的管理范围,后续可以被重用(比如v1后续添加元素时,直接使用这部分内存,无需重新分配)。
  • 当vector被析构时(比如离开作用域),其底层所有分配的内存会被全部释放;也可以主动调用v1.shrink_to_fit()(C++11起),请求vector将capacity缩减到与size匹配(这是一个请求而非强制,但主流编译器如GCC/Clang/MSVC都会处理)。

三、是否有内存泄漏风险?

没有

内存泄漏的定义是:程序中动态分配的内存不再被使用,且无法被回收。而vector遵循RAII(资源获取即初始化)原则,其底层内存的分配和释放由容器自动管理

  1. 赋值时,原来的内存即使没有立即释放,也仍被vector的内部指针指向,属于vector的管理范围,并非“无法回收”;
  2. 当vector对象(v1)的生命周期结束(比如离开作用域),其析构函数会调用分配器(allocator)的deallocate方法,释放所有底层内存;
  3. 即使是自定义类型,只要析构函数正确实现,也不会出现资源泄漏。

唯一可能的泄漏场景:如果手动用new创建vector对象(如vector<int>* v1 = new vector<int>{1,2,3,4,5};),但忘记用delete销毁,此时会导致vector的底层内存泄漏。但问题中是栈上的vector对象,生命周期由编译器自动管理,不会出现这种情况。

补充:验证代码

#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>v1={1,2,3,4,5};vector<int>v2={5,6};cout<<"赋值前:v1.size="<<v1.size()<<", v1.capacity="<<v1.capacity()<<endl;// size=5, capacity=5(多数实现)v1=v2;cout<<"赋值后:v1.size="<<v1.size()<<", v1.capacity="<<v1.capacity()<<endl;// size=2, capacity=5(多数实现)v1.shrink_to_fit();// 主动请求缩容cout<<"缩容后:v1.size="<<v1.size()<<", v1.capacity="<<v1.capacity()<<endl;// size=2, capacity=2(多数实现)return0;}

总结

  1. 赋值后v1.size()是2;
  2. 原来的元素对象会立即销毁,底层内存不一定立即释放,但会被vector管理;
  3. 无内存泄漏风险,vector的RAII机制保证了内存的自动回收。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 1:05:33

【std::vector】resize元素处理方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录核心原理与代码验证分步解释关键问题1. v.resize(5) 对后5个元素的处理2. v.resize(7) 新增元素的值总结你想弄清楚这段C代码中&#xff0c;vector执行resize(5)后原…

作者头像 李华
网站建设 2026/4/24 14:51:28

FastReport开源报表终极指南:重构.NET数据可视化开发体验

FastReport开源报表终极指南&#xff1a;重构.NET数据可视化开发体验 【免费下载链接】FastReport Free Open Source Reporting tool for .NET6/.NET Core/.NET Framework that helps your application generate document-like reports 项目地址: https://gitcode.com/gh_mir…

作者头像 李华
网站建设 2026/4/21 13:16:47

终极MapleStory游戏编辑器:Harepacker复活版完整使用指南

终极MapleStory游戏编辑器&#xff1a;Harepacker复活版完整使用指南 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 想要深度定制你的Maple…

作者头像 李华
网站建设 2026/4/18 14:38:45

Vue 3企业级后台系统快速上手:Element Plus Admin完整实践指南

Vue 3企业级后台系统快速上手&#xff1a;Element Plus Admin完整实践指南 【免费下载链接】element-plus-admin 基于vitetselementPlus 项目地址: https://gitcode.com/gh_mirrors/el/element-plus-admin Element Plus Admin是基于现代Vue.js 3技术栈构建的企业级后台管…

作者头像 李华
网站建设 2026/4/24 10:45:01

青龙面板自动化脚本5步配置法:告别手动重复操作

青龙面板自动化脚本5步配置法&#xff1a;告别手动重复操作 【免费下载链接】huajiScript 滑稽の青龙脚本库 项目地址: https://gitcode.com/gh_mirrors/hu/huajiScript 还在为每天重复的签到任务烦恼吗&#xff1f;还在手动执行各种平台任务吗&#xff1f;今天我要分享…

作者头像 李华