【c++】vector.clear()的記憶體洩露問題

BHY_發表於2017-07-12

轉自:http://www.cnblogs.com/taiyang-li/p/5997021.html


例一

vector<int> vec;
while (1)
{
  vec.push_back(1);
  vec.push_back(2);
  vec.push_back(3);
  ....  
  
  // 處理的vec
  func(vec);

  // 釋放vec記憶體
  vec.clear();            
}

例二

#include <iostream>
#include <vector>
 
using namespace std;
 
vector <string> v;
char ch;
 
int main ()
{
 
    for(int i=0; i<1000000; i++)
        v.push_back("abcdefghijklmn");
    cin >> ch;
    // 此時檢查記憶體情況 佔用54M
 
    v.clear();
    cin >> ch;
    // 此時再次檢查, 仍然佔用54M
 
    cout << "Vector 的 容量為" << v.capacity() << endl;
    // 此時容量為 1048576
 
    vector<string>(v).swap(v);
 
    cout << "Vector 的 容量為" << v.capacity() << endl;
    // 此時容量為0
    cin >> ch;
    // 檢查記憶體,釋放了 10M+ 即為資料記憶體
    return 0;
}

可是使用clear釋放vector記憶體有是問題的,可參考c++標準:

  

  clear只是將vector的size置零,可是並不保證capacity為零,因此clear並不能釋放vector已經申請的記憶體。可使用vector<T>().swap(x)完成釋放記憶體的操作。swap技法就是通過交換函式swap(),使得vector離開其自身的作用域,從而強制釋放vector所佔的記憶體空間

比如

    hierarchy.clear();
    vector<Vec4i>(hierarchy).swap(hierarchy);   
    contours.clear();
    vector<vector<Point>>(contours).swap(contours);
    mu.clear();
    vector<Moments>(mu).swap(mu);
    mc.clear();
    vector<Point2f>(mc).swap(mc);


相關文章