[英]Reference to a queue that resides on function stack
这是一些使用队列的C ++代码。
#include <iostream>
#include <queue>
using namespace std;
void print(queue<int>& q){
int n = q.size();
for (int i = 0; i < n; ++i){
int front = q.front();
cout<<front<<" ";
q.pop();
q.push(front);
}
cout<<endl;
}
template <typename T>
void foo(queue<T>& q){
queue<T> q2;
for(int i=4;i<7;i++)
q2.push(i);
q = q2;
}
int main(){
queue<int>q;
for(int i=1;i<4;i++)
q.push(i);
print(q);
foo(q);
print(q);
}
队列q
在main
函数中声明,并在函数foo
作为引用传递。 但是它被重新分配给另一个队列q2
,该队列占用函数堆栈空间内的内存。
据我了解,函数foo
终止后,引用变量应指向无效的内存地址,因为队列q2
将会被破坏。
有人可以帮我解决这两个问题吗?
1.即使函数调用终止后队列q2
已被销毁, q
为何保持q2
的正确元素。
2.参考变量仅应初始化一次。 但是似乎我们可以根据需要多次为其分配不同的值。 为什么允许这样做?
我一直认为这是深层复制的含义。 但是我无法找到队列STL具有的副本分配运算符的内部实现。 如果有人可以帮助我提供一个链接,那将是很棒的。
您对参考文献只能分配一次的理解是正确的。 从某种意义上说,引用是对象的别名 ,它们不是对象本身,而是始终引用另一个对象。 通过设计,它们在语法上的用法是在大多数情况下代替具体对象。 另一方面,可以使指针指向另一个对象或nullptr
。
q = q2
的结果是将q2
的内容分配给q
引用的队列。 这确实是一个深层副本,此后不引用局部函数q2
,也没有悬空引用。
queue
的operator=
文档可以在这里找到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.