STL中vector的動態記憶體問題

時間 2021-05-30 13:32:16

1樓:

對於vs,是在棧上有一塊空間,空間裡面用了三個指向堆的指標來管理一塊堆上的記憶體,對於p,是在堆上有一塊空間,空間裡面用了三個指向堆的指標來管理一塊堆上的記憶體。比如對於vector < Widget >,你的一些Widget物件永遠是在堆上的,在一塊連續的記憶體中,但是管理這塊記憶體的那個物件可以在棧上,也可以在堆上。

2樓:大大大 大西瓜

我說一下我的見解(第一次回答見諒)

我自己也剛好實現過這個模板類你可以看一下vector的實現原始碼 vector是個封裝的模板類裡面有三個變數 int size(陣列元素個數) int capacity(實際陣列容量個數一般比size大,為了提高插入元素效率)

T* object(指向第乙個元素的指標)當你定義乙個物件時建構函式會根據你的定義向堆空間申請一塊記憶體(存放陣列元素) object就指向這塊記憶體這塊堆上記憶體就存放你的資料析構函式會負責釋放這塊堆上記憶體(否則會造成記憶體洩漏)

Template

class vector

~vector()

enum

......

...}

我寫了這個模板類的一小部分,還有其他的建構函式,運算子過載,成員函式就不寫了,你大概明白這個類對記憶體(堆)管理就好了

你呼叫時不用考慮那麼多都是封裝好的

自己學好了可以自己實現自己改裝

3樓:

實際上,不論你怎麼對vector進行push_back(),sizeof(vector)的值永遠都不會變,變的只是vector的size()

因為在c++中,乙個變數的型別,就表明了這個變數在記憶體中占用位元組的大小,只要變數型別不變,sizeof()就不會變,而變數的型別是不允許改變的,因此vector自身是不能改變自身的大小的

vector只是乙個實現了動態記憶體管理記憶體的類,它通過建構函式在堆上建立真正用於儲存資料的物件並通過析構函式在堆上銷毀儲存資料的物件,那麼你對vector進行push_back()的時候,都是在對這個儲存資料的物件進行修改

因此你根本就不必用new來申請記憶體,可以理解為vector內部已經這麼做了(事實上vector使用的是allocator 來申請記憶體的),它只是做了乙個簡單包裝,讓你用起來更方便而已

4樓:丁冬

vector本身並不一定占用動態記憶體。vector只是管理了一片動態記憶體。

vector vs用棧上的vector管理一片動態記憶體。

new vector用動態記憶體裡的乙個vector管理另一片動態記憶體。

5樓:573xmcgcg

vector的記憶體分配並不是簡單的一句new就可以代替的,你把它當作高階的動態記憶體分配就好。在水平不夠時強行理解某些事情背後的機制會讓你走彎路。

動態記憶體申請對齊有什麼意義?

張砸鍋 好管理。就像乙個櫃子,如果東西亂七八糟的堆在裡面,想把不用的扔掉,不好找不好扔 就算找出來扔了,它空出來的那個位置想放別的東西,又不見得就遇到乙個剛好大小合適的 想整理一下吧,弄不好所有的東西都得倒騰一遍,真麻煩。改進的辦法就是裝隔板,固定大小的隔板。一格不夠就兩格合併成一格用,即使東西只有...

STL 的 vector 有哪些封裝上的技巧?

陳碩 試試正確實現 vec.push back vec.front 你就明白一些了。另外 sizeof vector 3 sizeof void 那麼 allocator 為什麼不佔空間? Milo Yip 很多時候我們都會自己實現和std vector相似的容器,例如RapidJSON裡的Valu...

C 中 vector 重新分配記憶體是怎樣實現的?

這個問題很好回答啊 1重新分配記憶體一般是擴大1.5倍 2倍什麼的具體不確定。2肯定要把原來的物件拷貝過去啊涉及到拷貝初始化物件,則會用到copy建構函式或者移動建構函式 c primer第五版一書中講到 c11新添了移動構造所以調研移動構造。若是c98則只能是copy構造咯.3肯定是虛構原來的物件...