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(): 0 rhovec.capacity(): 128 rhovec.size(): 1 rhovec.capacity(): 1
如上所示,我們就很好的解決了內存占用問題!