Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where does a std::vector allocate its memory?

Consider the following code snippet:

#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; } 

Assuming "vec" has no space left to store the 5 in the "sub" function, where does it allocate new memory?

In the stack frame of the sub function? In that case the 5 would be deleted at the end of the sub function. But the stack frame of the main function can't grow, as the stack frame of the sub function lies on top of the stack at that moment.
Does a std::vector allocate memory for its elements on the heap? But how does it free that heap memory? If it's a local vector on the stack, the stack frame of a function including the vector is deleted in the end without signaling the vector that it will be deleted?

like image 289
YoFrankie Avatar asked Apr 28 '12 18:04

YoFrankie


People also ask

Where are vectors allocated?

vector has an internal allocator which is in charge of allocating/deallocating memories from heap for the vector element . So no matter how you create a vector, its element is always allocated on the heap .

How is a vector of vectors stored in memory C++?

The elements of a vector are stored in a dynamically allocated block of memory; otherwise, the capacity of the vector could not increase. The vector object just holds a pointer to that block.

How do you allocate a std::vector?

An std::vector manages its own memory. You can use the reserve() and resize() methods to have it allocate enough memory to fit a given amount of items: std::vector<int> vec1; vec1. reserve(30); // Allocate space for 30 items, but vec1 is still empty.

Is std::vector stack allocated?

Although std::vector can be used as a dynamic array, it can also be used as a stack.


1 Answers

Does a std::vector allocate memory for its elements on the heap?

Yes. Or more accurately it allocates based on the allocator you pass in at construction. You didn't specify one, so you get the default allocator. By default, this will be the heap.

But how does it free that heap memory?

Through its destructor when it goes out of scope. (Note that a pointer to a vector going out of scope won't trigger the destructor). But if you had passed by value to sub you'd construct (and later destruct) a new copy. 5 would then get pushed back onto that copy, the copy would be cleaned up, and the vector in main would be untouched.

like image 77
Doug T. Avatar answered Sep 22 '22 04:09

Doug T.