![](/img/trans.png)
[英]C++: Allocate memory for an std::vector then initialize its elements in parallel
[英]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是否在堆上為其元素分配內存? 但是如何釋放堆內存呢? 如果它是堆棧上的局部向量,則包含該向量的函數的堆棧框架最終會被刪除,而不會向該向量發出將其刪除的信號?
STL中的所有容器都使用模板參數進行參數化,通常最后一個參數稱為A
或Allocator
,默認為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.