STL: Stores references or values?

前端 未结 2 2080
悲哀的现实
悲哀的现实 2021-02-07 22:15

I\'ve always been a bit confused about how STL containers (vector, list, map...) store values. Do they store references to the values I pass in, or do they copy/copy construct +

相关标签:
2条回答
  • 2021-02-07 22:22

    STL Containers copy-construct and store values that you pass in. If you want to store objects in a container without copying them, I would suggest storing a pointer to the object in the container:

    class abc;
    abc inst;
    vector<abc *> vec;
    vec.push_back(&inst);
    

    This is the most logical way to implement the container classes to prevent accidentally storing references to variables on defunct stack frames. Consider:

    class Widget {
    public:
        void AddToVector(int i) {
            v.push_back(i);
        }
    private:
        vector<int> v;
    };
    

    Storing a reference to i would be dangerous as you would be referencing the memory location of a local variable after returning from the method in which it was defined.

    0 讨论(0)
  • 2021-02-07 22:22

    That depends on your type. If it's a simple value type, and cheap to copy, then storing values is probably the answer. On the other hand, if it's a reference type, or expensive to copy, you'd better store a smart pointer (not auto_ptr, since its special copy semantics prevent it from being stored in a container. Go for a shared_ptr). With a plain pointer you're risking memory leakage and access to freed memory, while with references you're risking the latter. A smart pointer avoids both.

    0 讨论(0)
提交回复
热议问题