std::vector<X>().swap(*XX) 的用意

本文介绍了C++标准模板库(STL)中vector容器的内存管理机制,特别是如何通过swap技巧实现内存的收缩以释放不再使用的内存空间。

http://blog.youkuaiyun.com/jerryjbiao/article/details/7389233 


在容器vector中,其内存占用的空间是只增不减的,比如说首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。所有内存空间在vector析构时回收。

     一般,我们都会通过vector中成员函数clear进行一些清除操作,但它清除的是所有的元素,使vector的大小减少至0,却不能减小vector占用的内存。要避免vector持有它不再需要的内存,这就需要一种方法来使得它从曾经的容量减少至它现在需要的容量,这样减少容量的方法被称为“收缩到合适(shrink to fit)”。(节选自《Effective STL》)如果做到“收缩到合适”呢,嘿嘿,这就要全仰仗“Swap大侠”啦,即通过如下代码进行释放过剩的容量:

### `std::vector<QString>().swap(btnName)` 的作用与使用场景 在 C++ 编程中,`std::vector<QString>().swap(btnName)` 是一种常见的内存管理技巧,用于释放 `std::vector<QString>` 容器所占用的内存资源。该语句通过创建一个临时的空 `vector`,并将其与目标容器 `btnName` 进行交换,从而实现对 `btnName` 的内存释放[^1]。 具体而言,`std::vector<QString>()` 创建一个临时的空向量对象,随后调用 `swap()` 成员函数,将该临时对象与 `btnName` 的内容交换。由于临时对象在表达式结束后立即被销毁,其所接管的原 `btnName` 内容也将随之释放,从而达到释放内存的目的[^1]。 这一操作特别适用于需要显式释放向量内存的场景,例如: - 当一个 `std::vector<QString>` 对象在其生命周期内存储了大量字符串数据,但在后续逻辑中不再需要这些数据时,可以使用此方式快速释放内存。 - 在频繁修改向量内容后,希望收缩其内存占用以减少资源消耗。 - 在类的析构函数中,确保成员变量 `std::vector<QString>` 所占用的资源被及时释放。 以下是一个典型的使用示例: ```cpp std::vector<QString> btnName = {"Button1", "Button2", "Button3"}; // 使用完成后释放内存 std::vector<QString>().swap(btnName); ``` 通过该方式,`btnName` 中的元素将被清空,并且其底层内存也将被释放回系统,从而避免内存浪费。 需要注意的是,`swap()` 操作不会调用任何构造函数或析构函数,仅交换两个向量的内部指针和大小信息,因此效率较高。此外,使用此方法后,`btnName` 将变为空向量,再次使用前需重新填充数据。 ### 相关问题 1. `std::vector<QString>` 和 `QList<QString>` 在内存管理上有何区别? 2. 如何判断 `std::vector<QString>` 是否已经成功释放内存? 3. 除了 `swap()` 方法外,还有哪些方式可以优化 `std::vector<QString>` 的内存占用?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值