记录一下自己笔试时踩的关于引用的坑
- 平常比较多使用引用,认为能够减少重新构建局部变量的开销,特别是局部变量是一个比较大的对象或者数据结构时。
但在下面场景下,引用就会出现错误。
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操作之后,优先队列会执行一些操作去维护这个队列的有序性,因此会对这个地址上的内存进行释放或者改写。
- 如有其他看法也欢迎讨论
本文探讨了在使用引用时可能遇到的问题,特别是在涉及优先级队列的场景下。作者通过示例代码指出,当引用一个优先队列中的元素并执行pop操作后,由于队列内部的结构调整,可能导致引用的对象被释放或改变,从而引发迭代器失效的问题。文章鼓励开发者在使用引用时注意这类潜在风险,并提出了相应的解决方案。
&spm=1001.2101.3001.5002&articleId=120275471&d=1&t=3&u=d175c564e5cc4858a8f6d8c03bb2ede8)
9384

被折叠的 条评论
为什么被折叠?



