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 #include#include
using
namespace
std;
struct
grainrho
;int
main() ;
rhovec.push_back(grainrho);
}rhovec.clear();
cout
<< "
rhovec.size():
"<< rhovec.size()
<< "
rhovec.capacity():
"<< rhovec.capacity()
().swap(rhovec);
grainrho = ;
rhovec.push_back(grainrho);
cout
<< "
rhovec.size():
"<< rhovec.size()
<< "
rhovec.capacity():
"<< rhovec.capacity()
"pause");
}
如上所示,首先我們給這個rhovec存入了很多元素,然後呼叫clear()函式,但是實際上記憶體還是沒有釋放而是繼續占用的,所以,我們使用 「vector().swap(rhovec)」 來釋放記憶體,最後又存入乙個grainrho,所以最終結果只有乙個grainrho占用記憶體。
最終結果如下所示:
rhovec.size(): 0rhovec.capacity():
128rhovec.size():
1rhovec.capacity():
1
如上所示,我們就很好的解決了記憶體占用問題!
c vector 釋放記憶體
1.釋放單個指標 關於vector中存放指標的問題,在進行清空的時候比較安全的一種做法是 std vectorclassnamevec push back new classname std vector iterator classnameit classnamevec.begin for cla...
c vector 如何釋放記憶體
1.vector容器的記憶體自增長 與其他容器不同,其記憶體空間只會增長,不會減小。先來看看 c primer 中怎麼說 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空...
C vector中的記憶體分配與釋放
c vector中resize與reserve的比較 因此,接下來記錄vector是如何進行記憶體的分配與釋放的 c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存 vector的乙個特點 記憶體空間只會增長,不會減小 設想一下,當vec...