C++返回vector元素引用时地址不匹配,如何正确实现?
如何正确返回std::vector元素的引用并比较内存地址?
你的问题核心出在函数参数的传递方式上,咱们拆解来看:
先看你写的函数代码:
const int &test(std::vector<int> i) { return i.at(3); }
这里的参数std::vector<int> i是传值传递——调用test(i)时,程序会把原vector完整复制一份,函数内部操作的是这个临时生成的副本。当函数执行结束,这个临时副本会被自动销毁,你返回的引用就变成了悬空引用,指向的是已经被释放的内存空间。这时候j绑定的是已销毁副本里的元素地址,自然和原vector的i.at(3)地址完全不同,也就出现了你看到的地址不匹配错误。
修正后的写法
只需要把函数参数改成const引用传递,这样就不会创建临时副本,函数直接操作原vector的内存:
const int &test(const std::vector<int>& i) { return i.at(3); }
你的测试代码不需要改动,运行后就能通过断言:
TEST(test, all_test) { const std::vector<int> i = {1,2,3,4,5}; const int &j = test(i); ASSERT_THAT(&j, Eq(&i.at(3))); }
此时j绑定的就是原vector中第4个元素的引用,它们的内存地址完全一致,断言会成功通过。
内容的提问来源于stack exchange,提问作者Greeneco
相关产品推荐
相关产品推荐

