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

遍历std::vector存入元素地址,为何指针均指向同一实例?

问题原因分析

你遇到的问题核心是范围for循环中变量的类型错误,导致存入的不是原容器元素的地址,而是同一个临时拷贝变量的地址。

你的MyClass代码问题点

在这段循环代码中:

for (auto t : entries)
{
    if (t.get_idx() > 0)
    {
        std::cout << t.get_idx() << ", " << t.get_name() << std::endl;
        chosen.push_back(&t);
    }
}

auto t : entries中的t是entries内元素的拷贝,而非引用。整个循环过程里,t是一个栈上的局部变量,每次循环仅将entries里的元素赋值给这个t,因此t的内存地址固定不变。当你把&t存入chosen时,所有指针都会指向同一个t的地址;循环结束后,t最后一次被赋值为entries的最后一个元素,所以最终所有指针都指向这个值。

和int指针示例的差异

你的int指针示例能正常输出,是因为直接取了两个独立栈变量a和b的地址——这两个变量的内存地址本身就不同,存入的是两个完全独立的指针,自然结果正确。这和MyClass代码的逻辑本质不同:你并没有取原容器元素的地址,而是取了拷贝变量的地址。

修复方案

只需将循环变量改为引用类型,让t直接绑定到entries里的原元素,取地址就是原元素的真实地址:

for (auto& t : entries)  // 添加&,使用引用而非拷贝
{
    if (t.get_idx() > 0)
    {
        std::cout << t.get_idx() << ", " << t.get_name() << std::endl;
        chosen.push_back(&t);
    }
}

修改后,chosen里的指针会分别指向entries中符合条件的原元素,输出结果将符合预期。

内容的提问来源于stack exchange,提问作者sodiumnitrate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:36:34