標籤:vector
vector的記憶體會不會泄露?
即使不泄露,怎麼能縮小所佔空間呢?
我們知道vector有個clear()方法?
原型:
#include <vector>void clear();
函數clear()刪除儲存在vector中的所有元素. 如果vector的元素是一些object, 則它將為當前儲存的每個元素調用它們各自的解構函式(destructor). 然而, 如果vector儲存的是指向對象的指標, 此函數並不會調用到對應的解構函式. 在第二種情況下, 為了完全刪除vector中的元素則應使用一個類似於下的迴圈:
std::vector<SomeObject*> aVector; //The elements of the vector are created with the operand ‘new‘ at some point in the program [...] for(int i=0 ; i<aVector.size() ; i++) delete aVector[i]; aVector.clear();
調用clear之後, vector的尺寸(size)將變成zero. 但它的容量(capacity)卻並不發生變化, vector本身並不釋放任何記憶體.
如果你想同時做到清空vector的元素和釋放vector的容量, 你可以使用swap技巧。
這樣做會建立一個臨時的空vector, 它將替換希望清空的vector。
“vector 的 clear 不影響 capacity , 你應該 swap 一個空的 vector。”
vector<type>(v).swap(v);
//對於string則可能像下面這樣
string(s).swap(s);
即先建立一個臨時拷貝與原先的vector一致,值得注意的是,此時的拷貝 其容量是儘可能小的符合所需資料的。緊接著將該拷貝與原先的vector v進行 交換。好了此時,執行交換後,臨時變數會被銷毀,記憶體得到釋放。此時的v即為原先 的臨時拷貝,而交換後的臨時拷貝則為容量非常大的vector(不過已經被銷毀)
為了證明這一點,我寫了一個程式,如下:
#include <iostream>#include <vector>using namespace std;vector <string> v;char ch;int main(){ for (int i = 0; i<1000000; i++) v.push_back("hello vector"); 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;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
沒有躲過的坑--正確釋放vector的記憶體