You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:10:05