沒有躲過的坑--正確釋放vector的記憶體

來源:互聯網
上載者:User

標籤: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的記憶體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.