c vector的記憶體釋放

2021-09-08 14:04:32 字數 1598 閱讀 4314

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(): 0

rhovec.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...