记录一下自己笔试时踩的关于引用的坑
- 平常比较多使用引用,认为能够减少重新构建局部变量的开销,特别是局部变量是一个比较大的对象或者数据结构时。
但在下面场景下,引用就会出现错误。
priority_queue<vector<int>, vector<vector<int>>> q;
while (true) {
auto& n = q.top();//加了引用
q.pop();
dosth(n);//这里的n已经发生变化
}
while (true) {
auto n = q.top();//没有加引用
q.pop();
dosth(n);//操作的是局部变量
}
个人猜想
- 引用就是引用一个地址上的变量,在上述场景中,执行了pop操作之后,就会存在类似迭代器失效的问题。
- 因为当前引用的是优先队列内部的一个对象,当执行了pop操作之后,优先队列会执行一些操作去维护这个队列的有序性,因此会对这个地址上的内存进行释放或者改写。
- 如有其他看法也欢迎讨论