c++ vector的內存釋放

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().swap(rhovec)” 來釋放內存,最後又存入一個grainRho,所以最終結果只有一個grainRho佔用內存。

最終結果如下所示:

rhovec.size(): 0
rhovec.capacity(): 128
rhovec.size(): 1
rhovec.capacity(): 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章