这是一些使用队列的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.为什么q
保留q2
的正确元素,即使队列q2
在函数调用终止后已被销毁。
2.参考变量仅应初始化一次。但是似乎我们可以根据需要多次为其分配不同的值。为什么允许这样做?
我一直认为这是深层复制的含义。但是我无法找到队列STL具有的副本分配运算符的内部实现。如果有人可以帮助我提供指向该链接的信息,我将非常好。
答案 0 :(得分:1)
您对引用只能分配一次的理解是正确的。引用是对象的别名,它们不是对象本身,而是始终引用另一个对象。通过设计,它们在语法上的用法是在大多数情况下代替具体对象。另一方面,可以使指针指向其他对象或public
。
nullptr
的结果是q = q2
的内容被分配给q2
所引用的队列 。这确实是一个深层副本,并且此后未引用局部函数q
,并且没有悬挂引用。
here中找到q2
的{{1}}的文档。