Home > Software engineering >  Why shared ptr in vector not delete with reserve
Why shared ptr in vector not delete with reserve

Time:02-11

class A{
    public:
        A(){cout<<"constructor"<<endl;}
        ~A(){cout<<"destructor"<<endl;}
};

int main()
{   
    {
        //case 1
        vector<std::shared_ptr<A>> vec;
        vec.reserve(1);
        vec[0] = std::make_shared<A>();
    }
    // Not destructor
    {
        //case 2
        vector<std::shared_ptr<A>> vec;
        vec.emplace_back(std::make_shared<A>());
    }
    // Called destructor
  return 0;
}

Why vec at end of life, the element within it not be deleted in case1.result

If we not reserve vector, but emplace back element to vec, it works.

CodePudding user response:

TL;DR: I guess this is a typo and you meant to call resize(1) instead of reserve(1), but I'd like to explain a bit, because I see how one could easily confuse the two functions.


std::vector has a capactiy (the total slots that can be used) and a size (the number of slots actually used).

reserve() will increase the capacity, i.e. make room for more elements, but it will not increase the size. That's the job of resize():

vec.reserve(1); // capacity >= 1, size = 0!

Access to a vector is out of bounds if the index is >= the vector's size, irrespective of it's capacity, thus

vec[0] = std::make_shared<A>();

is out of bounds and leads to undefined behaviour. (index 0 >= size 0)

  •  Tags:  
  • c
  • Related