我一直对STL容器(vector,list,map ...)如何存储值感到困惑。他们存储对我传入的值的引用,还是复制/复制构造+存储值本身?
例如,
int i;
vector<int> vec;
vec.push_back(i);
// does &(vec[0]) == &i;
和
class abc;
abc inst;
vector<abc> vec;
vec.push_back(inst);
// does &(vec[0]) == &inst;
由于
答案 0 :(得分:18)
STL容器复制构造并存储您传入的值。如果要将对象存储在容器中而不复制它们,我建议在容器中存储指向该对象的指针: / p>
class abc;
abc inst;
vector<abc *> vec;
vec.push_back(&inst);
这是实现容器类的最合理的方法,以防止在已停止的堆栈帧上意外存储对变量的引用。考虑:
class Widget {
public:
void AddToVector(int i) {
v.push_back(i);
}
private:
vector<int> v;
};
存储对i
的引用将是危险的,因为在从定义它的方法返回后,您将引用局部变量的内存位置。
答案 1 :(得分:4)
这取决于你的类型。如果它是一个简单的值类型,并且便宜复制,那么存储值可能就是答案。另一方面,如果它是一个引用类型,或复制起来很昂贵,你最好存储一个智能指针(而不是auto_ptr,因为它的特殊复制语义阻止它存储在容器中。转到shared_ptr)。使用普通指针会冒内存泄漏和访问释放内存的风险,而使用引用会冒后者的风险。智能指针可以避免这两种情况。