簡體   English   中英

std :: vector在哪里分配其內存?

[英]Where does a std::vector allocate its memory?

考慮以下代碼片段:

#include <vector>
using namespace std;

void sub(vector<int>& vec) {
    vec.push_back(5);
}

int main() {
    vector<int> vec(4,0);
    sub(vec);
    return 0;
}

假設“ vec”在“ sub”函數中沒有剩余空間來存儲5,它將在哪里分配新的內存?

在子功能的堆棧框架中? 在這種情況下,5將在子函數的末尾刪除。 但是主函數的堆棧框架無法增長,因為此時子功能的堆棧框架位於堆棧的頂部。
std :: vector是否在堆上為其元素分配內存? 但是如何釋放堆內存呢? 如果它是堆棧上的局部向量,則包含該向量的函數的堆棧框架最終會被刪除,而不會向該向量發出將其刪除的信號?

std :: vector是否在堆上為其元素分配內存?

是。 或更准確地說,它基於您在構造時傳遞的分配器進行分配。 您沒有指定一個,所以您獲得了默認分配器。 默認情況下,這將是heap

但是如何釋放堆內存呢?

通過其析構函數超出范圍時。 (請注意, 指向向量的指針超出范圍不會觸發析構函數)。 但是,如果您已按值將值傳遞給sub可以構造(然后銷毀)新副本。 然后將5推回到該副本上,副本將被清理,並且main的向量將保持不變。

STL中的所有容器都使用模板參數進行參數化,通常最后一個參數稱為AAllocator ,默認為std::allocator<...> ,其中...表示容器內存儲的值的類型。

Allocator是用於提供內存和構建/銷毀此內存區域中的元素的類。 它可以從池中分配內存,也可以直接從堆中分配內存,無論您從中構建分配器。 默認情況下, std::allocator<T>::operator new的簡單包裝,因此將根據您的推斷在堆上分配內存。

內存是按需分配的,至少在調用vector的析構函數時才釋放。 C ++ 11也引入了shrink_to_fit來更快地釋放內存。 最后,當向量超出其當前容量時,將進行新的(較大)分配,將對象移至該分配,並釋放舊的分配。

像所有局部變量一樣,析構函數在執行到達聲明其作用域的末尾時調用。 因此,在函數退出之前,將調用向量析構函數,並且只有在此之后,堆棧才會收縮,並且控制權返回給調用者。

另請注意,向量( vec )是對象本身。 它駐留在堆棧上,並且當此對象超出范圍(在您的情況下為main結尾)時,它將被破壞。 元素的內存在此對象初始化期間分配,並隨其銷毀而釋放,這是RAII慣用語的一個很好的示例,因為元素的資源管理與矢量對象的壽命相關。

因為您為sub提供了堆中向量的地址,所以它將在堆中分配。 如果沒有剩余空間,則應引發異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM