对驻留在函数堆栈上的队列的引用

时间:2018-10-02 00:30:24

标签: c++ queue

这是一些使用队列的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);

}

队列qmain函数中声明,并在函数foo中作为引用传递。但是它被重新分配到另一个队列q2,该队列占用函数堆栈空间内的内存。

据我了解,函数foo终止后,引用变量应指向无效的内存地址,因为队列q2将被破坏。

有人可以帮我解决这两个问题吗?
1.为什么q保留q2的正确元素,即使队列q2在函数调用终止后已被销毁。
2.参考变量仅应初始化一次。但是似乎我们可以根据需要多次为其分配不同的值。为什么允许这样做?

我一直认为这是深层复制的含义。但是我无法找到队列STL具有的副本分配运算符的内部实现。如果有人可以帮助我提供指向该链接的信息,我将非常好。

1 个答案:

答案 0 :(得分:1)

您对引用只能分配一次的理解是正确的。引用是对象的别名,它们不是对象本身,而是始终引用另一个对象。通过设计,它们在语法上的用法是在大多数情况下代替具体对象。另一方面,可以使指针指向其他对象或public

nullptr的结果是q = q2的内容被分配给q2所引用的队列 。这确实是一个深层副本,并且此后未引用局部函数q,并且没有悬挂引用。

here中找到q2的{​​{1}}的文档。