繁体   English   中英

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

[英]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);

}

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

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

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

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

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

q = q2的结果是将q2的内容分配给q 引用的队列。 这确实是一个深层副本,此后不引用局部函数q2 ,也没有悬空引用。

queueoperator=文档可以在这里找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM