c++ vector的記憶體釋放

來源:互聯網
上載者:User

標籤:cap   swa   訪問   容量   push   很多   system   析構   city   

 

  c++中vector的一個特點是: 記憶體空間只會增長,不會減小。即為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都挨著前一個元素儲存設想,如果每次vector添加一個新元素時,為了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣效能就會非常慢,所以,實際上分配時其容量要比當前所需容量更多,即vector預留了一些額外的儲存區,這樣就不必單獨為每個新元素重新分配記憶體空間,減少開銷。 另外,在vector中記憶體只增不減體現在 - 比如首先分配了10000個位元組,然後erase掉後面9999個,留下一個有效元素,但是實際上記憶體佔用仍然為10000個,所有記憶體空間是在vector析構的時候才能被系統回收。所以,即使使用clear,vector所佔用的記憶體空間依然如故,無法保證記憶體的回收。

  當然,對於資料量很小的vector,完全沒有必要進行主動釋放,就比如200 * 200的格線運算,就是沒有必要的,但是如果是1000 * 1000,那麼就是前者的25倍了,這時就需要進行主動記憶體釋放了。

  另外,既然要進行記憶體釋放,我們不得不掌握size()和capacity()方法的區別,前者是實際的vector元素個數,後者是實際佔用記憶體的個數,一般來說,capacity()是大於或等於size()的。

  所以,我們可以使用swap()來協助釋放記憶體,具體方法如下:

 

#include <iostream>#include <windows.h>#include <vector>using namespace std;struct GrainRho{    int key;    double rho;};int main() {    static vector<struct GrainRho> rhovec;    static vector<struct GrainRho>::iterator itrho;    GrainRho grainRho;        for (int i = 0; i < 100; i++) {        grainRho = {i, 0.5 + double(i)};        rhovec.push_back(grainRho);    }    rhovec.clear();    cout << "rhovec.size(): " << rhovec.size() << endl;    cout << "rhovec.capacity(): " << rhovec.capacity() << endl;    vector<struct GrainRho>().swap(rhovec);    grainRho = {1995, 6.28};    rhovec.push_back(grainRho);    cout << "rhovec.size(): " << rhovec.size() << endl;    cout << "rhovec.capacity(): " << rhovec.capacity() << endl;    system("pause");}

 

 

如上所示,首先我們給這個rhovec存入了很多元素,然後調用clear()函數,但是實際上記憶體還是沒有釋放而是繼續佔用的,所以,我們使用 “vector<struct GrainRho>().swap(rhovec)” 來釋放記憶體,最後又存入一個grainRho,所以最終結果只有一個grainRho佔用記憶體。

 

最終結果如下所示:

rhovec.size(): 0rhovec.capacity(): 128rhovec.size(): 1rhovec.capacity(): 1

如上所示,我們就很好的解決了記憶體佔用問題! 

 

  

c++ 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.