0
点赞
收藏
分享

微信扫一扫

swap释放vector内存

int main() {
vector<int> vec;
for (int i = 0; i < 1000; i++) {
vec.emplace_back(i);
}
cout << "capacity:" << vec.capacity() << " size:" << vec.size() << endl;
vec.clear();
cout << "capacity:" << vec.capacity() << " size:" << vec.size() << endl;
}

打印结果:

capacity:1024 size:1000
capacity:1024 size:0

用clear清除所有元素,发现元素数变为0以后程序占用的内存并没有减少。

vector的clear()方法做的事情是把vector内的元素全部删除掉,并调用元素所存储对象的析构函数释放对象,但这并不会改变vector本身所占用内存的大小。

通过 swap()方法完全释放 vector占用的内存。swap后,vector的capacity和size都变为0:

解决方法:

vector的swap()方法释放内存实际是用了一个小技巧,swap()方法功能是交换对象,即将当前对象内容与传进的同类型vector对象交换。这里就是通过将当前vec对象和一个空临时vector对象交换,交换之后,vec对象的空间变为0,临时对象占用的内存空间变为 vec 之前占用的内存空间。临时对象的作用域就是该语句,随着生命周期结束,该对象在被析构的时候会释放内存。这样就达到了释放vec占用内存空间的目的。

int main() {
vector<int> vec;
for (int i = 0; i < 1000; i++) {
vec.emplace_back(i);
}
cout << "capacity:" << vec.capacity() << " size:" << vec.size() << endl;
vector<int>().swap(vec);
cout << "capacity:" << vec.capacity() << " size:" << vec.size() << endl;
}

打印结果:

capacity:1024 size:1000
capacity:0 size:0

如果只想释放vec所占用的过多的内存,并不完全清空,则可以使用类似代码:

int main() {
vector<int> vec;
for (int i = 0; i < 1000; i++) {
vec.emplace_back(i);
}
cout << "capacity:" << vec.capacity() << " size:" << vec.size() << endl;
vector<int>(vec).swap(vec);
cout << "capacity:" << vec.capacity() << " size:" << vec.size() << endl;
}
capacity:1024 size:1000
capacity:1000 size:1000

即用vec构造一个临时vector,临时vector的容量恰好满足原vector的大小,没有预留空间。临时vector随即与原vector进行交换。这样原vec以前多余的空间就被释放了,而临时vector随着离开作用域也被自动释放。

假定一个服务程序使用vector存储所有在线用户数据,在高峰时段用户量达到1亿,vector占用了10GB的内存,系统处于极高负载状态。随后用户量不断减少直到低谷100个,这时vector占用的内存依然是10GB。调用clear方法只会减少vector中存储的用户数,但不会减少所占用内存。这种场景下就可以使用上面描述的方法降低程序所用内存,减轻系统负载。


举报

相关推荐

0 条评论