Search code examples
c++vectorallocation

Can I keep vector data even after out of scope


I come from a C background. I used to allocate memory/array, for example, sending it to somewhere else, and the pointer stayed there, even after, the scope where it was allocated was destroyed.

Now, if I do the same with vectors : initialize, pass it by reference, and then keep that reference saved somewhere. After the initial method, that actually created the vector, goes out of scope, would it be destroyed ? Or as the pointer to it is still saved, it will be kept.


Solution

  • std::vector frees the memory it holds when it is destroyed. Holding a reference to an object that gets destroyed is very bad. Accessing it is UB. General rule: Do not store references, only use them where you can be sure that the object exists for the entire scope, e.g. as parameter of a function.

    If you want to keep a copy of the data, simply copy the std::vector. No reference needed.

    If you want to be able to access the data from different locations, and have it live as long as at least one location still has a reference/pointer to it, don't use std::vector, use std::shared_ptr.

    If you want to combine the benefits of std::vector with the benefits of shared memory that lives until the last place lets go of it, combine them: std::shared_ptr<std::vector<...>>.

    If you want to have the std::vector live in one place for a bit, and then live in another place but not in the first place anymore, use move semantics:

    std::vector<int> foo = {1, 2, 3};
    std::vector<int> bar = std::move(foo); // bar now holds the data that foo held, foo is empty, no copy was performed