使用std::vector的push_back传入back返回的引用是否安全?
问题
我注意到std::vector<T>::push_back的参数是const T&。我知道调用push_back时可能会触发内存重新分配,但std::vector<T>::back返回的是引用。请问如下代码的写法是否安全?
std::vector<std::string> s{"some string"s}; s.push_back(s.back());
结论:这种写法是安全的
你不需要担心悬垂引用或未定义行为的问题,原因在于C++标准对std::vector::push_back(const T&)的行为有明确要求:
- 当
push_back需要触发内存扩容时,实现必须保证在任何可能导致原有元素引用失效的操作(比如销毁原内存中的元素)之前,先完成对参数的复制(通常是复制到临时对象中)。 - 扩容过程中原有元素的销毁不会影响新元素的构造——新元素的构造依赖的是提前复制好的临时值,而非原容器中已失效的引用。
更直观的执行顺序如下:
- 调用
s.push_back(s.back())时,参数绑定到当前vector的最后一个元素(此时引用完全有效)。 - 检查vector容量:若不足,先复制
s.back()的值到临时对象。 - 分配新内存、将原vector的所有元素移动/复制到新内存、销毁原内存中的元素并释放空间。
- 用临时对象的值在新vector的末尾构造新元素。
- 销毁临时对象。
即使在C++11之前的标准中,主流编译器实现也已经处理了这种场景,保证操作的安全性,所以你完全可以放心使用这种写法。
内容的提问来源于stack exchange,提问作者Mr. Python
相关产品推荐
相关产品推荐

