Search code examples
c++stlc++11smart-pointersvisual-c++-2012

Should I use std::unique_ptr<T> in a std::vector member variable in my class?


Imagine a class C that has a member variable m_MyList of type std::vector in which I want to store objects of type MyClass. C has two functions that add or remove objects in m_MyList. m_MyList should also be made accessible for consumers of C as they need to read the collection of MyClass objects. The external reader of the collection will have no means to change the collection, thus the MyClass objects are owned only by C.

Now my question: In C++11 style, what is the best T to store in the vector? The possibilities seem to be:

  • std::vector<MyClass>
  • std::vector<MyClass*>
  • std::vector<unique_ptr<MyClass>>, using std:move to push the unique_ptr into the vector

Solution

  • If the MyClass objects are owned by C, then the best option would be the simplest:

    std::vector<MyClass>
    

    The only reason I could see for using std::unique_ptrs here is if you need to keep pointers to a base class for polymorphism. In this case the unique_ptrs serve the purpose of releasing resources upon destruction of the vector. But then the C interface should not transfer ownership to the clients.