C++中向函数内的vector插入局部对象后,对象会如何变化?
容器push_back/insert传入局部变量时是复制还是引用?
代码块内声明的变量生命周期仅限于该代码块,退出代码块时变量会被销毁。但对于
std::vector、std::map这类容器,使用push_back()、insert()等操作传入局部变量时,是复制对象还是仅获取其引用?
示例控制台输出:
txt_0 txt_1 txt_2
示例代码:
#include <iostream> #include <vector> #include <sstream> using std::iostream; class A { public: std::string txt; }; class T { public: std::vector<A> list; void test() { for (int i = 0; i < 3; i++) { A a; a.txt = "txt_" + std::to_string(i); list.push_back(a); } } void show() { for (int i = 0; i < list.size(); i++) { std::cout << list[i].txt << std::endl; } } }; int main() { T t; t.test(); t.show(); }
解答
当调用std::vector::push_back()传入局部变量时,容器会复制这个对象到自身的内存空间中,并不会保存原变量的引用或指针。
以你的示例为例:每次循环里的局部变量a,在当前循环迭代结束后就会被销毁,但push_back(a)执行时已经把a的完整副本存入了list容器。后续调用show()时,访问的是容器内部独立保存的对象副本,所以能正常输出预期内容。
如果容器保存的是引用,那么局部变量a销毁后,容器里的引用就会变成悬空引用,此时访问会触发未定义行为(比如输出乱码、程序崩溃等)。
另外,若想避免复制带来的性能开销,可以使用push_back(std::move(a))来转移对象的所有权——这时候原局部变量a会进入“有效但不可用”的状态,容器直接接管它的资源,效率比复制更高。
内容的提问来源于stack exchange,提问作者orochi
相关产品推荐
相关产品推荐

