遍历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
相关产品推荐
相关产品推荐

