在STL中,使用vector的clear虽然可以清空元素,但是并不会释放内存(这是出于性能的考虑,应该是将不需要的空间打一个标签,表示不在使用,但并不释放)。如果在循环中连续使用,或者容器中的元素过大,会造成内存严重泄露。正确的处理方法如下:
vector<type> v;
//.... 这里添加许多元素给v
//.... 这里删除v中的许多元素
vector<type>(v).swap(v);
//此时v的容量已经尽可能的符合其当前包含的元素数量
//对于string则可能像下面这样
string(s).swap(s);
第4行vector<type>(v)使用了vector的拷贝构造函数创建了一个匿名vector对象,这个匿名对象调用swap(v)函数,使得该匿名对象所在的内存空间与v所在的内存空间进行交换。
创建的匿名vector对象只将合法的元素拷贝到匿名对象所在的内存空间,而打上非法元素标签的内存空间中的元素则没有拷贝到匿名vector,这样,将这两段内存空间进行置换,可以起到释放内存空间的作用。
引用:
匿名对象在本语句结束之后自动调用析构函数,回收空间。
匿名对象可以使用构造函数,拷贝构造函数创建。创建的语法如第4行,类型后直接加()。