Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can a Vec cause a stackoverflow?

Tags:

rust

let vector: Vec<u8> = Vec::new();

Can the vector in the code above cause a stackoverflow if the vector grows too big?

let vector: Vec<Box<u8>> = Vec::new();

How bout this one? Since its elements are on the heap.

let vector: Box<Vec<u8>> = Box::new(Vec::new());

I'm assuming that in the code above no stackoverflow should be possible, am i correct?

like image 923
Michelangelo Avatar asked Jul 29 '26 10:07

Michelangelo


1 Answers

No the actual data is on heap. So there will not be stack overflow.

What is on stack is capacity, length and the pointer to the actual data on heap. If regrowth is required then it is done on the heap. If it is moved (not cloned) then what is copied is just the length, capacity and pointer to data (bitwise shallow copy).

Not the actual implementation but if you have to implement Vector then you will start with:

pub struct Vec<T> {
    ptr: Unique<T>,
    cap: usize,
    len: usize,
}

You see the ptr is actually pointing to heap location where the data is. The vector on stack will consists of just few fields like the 3 mentioned above.

You cannot grow an object on stack, as you push objects on stack frame if any object is allowed to grow it will run over other objects. On heap for growth, if contiguous memory is not available, then entire data is moved to another place with newer capacity; if contiguous memory block is available, then growth in capacity is instant.

like image 88
Abhijit-K Avatar answered Aug 01 '26 06:08

Abhijit-K



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!