关于使用shrink_to_fit()释放二维std::vector内存的技术问询
关于二维std::vector内存释放的问题
首先直接给结论:只执行a.clear(); a.shrink_to_fit();是足够释放所有内存的,不需要先遍历内部vector做额外操作,原因如下:
- 当你调用
a.clear()时,外层vector会销毁它所有的元素——也就是那些内部的std::vector<int>对象。而每个std::vector的析构函数会自动释放它自己管理的动态内存,所以内部vector占用的内存会被彻底清理掉。 - 调用
a.clear()后,外层vector的size()会变成0,但capacity()还是原来的n(因为clear()不会改变容器的容量)。这时候a.shrink_to_fit()会向容器请求将容量缩减到与当前大小一致(也就是0),大多数标准库实现都会遵守这个请求,从而释放外层vector本身占用的多余内存。
不过有个更可靠的替代方案,如果你想确保100%释放所有内存(毕竟shrink_to_fit()只是请求而非强制),可以用swap技巧:
std::vector<std::vector<int>>().swap(a);
这个操作会把a和一个临时的空二维vector交换,临时对象在语句结束后会被析构,带走所有原来a占用的内存,效果非常彻底,代码也简洁。
总结一下:
- 如果你信任
shrink_to_fit()的实现,clear()+shrink_to_fit()完全够用; - 追求绝对可靠或者更简洁的话,用swap方法是最优解。
内容的提问来源于stack exchange,提问作者Алексей Брагин
相关产品推荐
相关产品推荐

