2011-01-21 230 views
2

什么是基于堆栈的引用?它们与作为对象成员的引用有什么不同?标准是否谈论这些?什么是基于堆栈的引用?

我碰到这an article来写的香草萨特:

Q1:是下面的代码合法的C++?

// Example 1 

string f() { return "abc"; } 

void g() { 
const string& s = f(); 
    cout << s << endl; // can we still use the "temporary" object? 
} 

A1:是的。这是一个C++功能... 代码是有效的,并且完全是 显示的功能。

通常情况下,临时对象只会持续到 ,直到它出现的完整 表达式的结尾。 然而,C++故意指定 一个临时对象绑定到 参考为const堆栈 上延长 的寿命临时到 参考本身的寿命,并且因此避免了什么 否则将一个共同的 悬空引用错误。在上面的 示例中,临时返回的 由f()生存,直到结束花括号 大括号。 (注这仅适用于 基于堆栈的引用。它不 工作对于那些成员的对象的 引用。

+0

从它看起来像它的措辞意味着引用是本地的功能,而不是一个引用,是一类 – vmpstr 2011-01-21 18:29:59

回答

4

在给定的上下文中,基于堆栈的引用指的是参考即堆栈上的自动对象。

即,在

// ... 
{ 
    // ... 
    const foo& x = some_foo; 
    // ... 
} 
// ... 

x是一个基于堆栈的对象,而在the_foo

class bar { 
    // ... 
    foo& the_foo; 
    // ... 
}; 

不是。

+0

@sbi的成员:我的理解。现在我认为你需要编辑你的文章,特别是变量名! – Nawaz 2011-01-21 18:34:51

0

基于堆栈的引用仅仅是一个生活在堆栈上的引用。

int main() 
{ 
    int a = 3; 
    int &b = a; // b is a stack-based reference 
    ... 
} 
1

基于堆栈的引用是基于堆的引用的替代方法。通常,返回值和局部变量值分配在“调用堆栈”中,该调用堆栈存储当前正在运行的函数的顺序。

一般来说,当你调用一个函数时,一个'堆栈帧'被放在堆栈上,包括足够的空间用于所有局部变量,参数和函数的返回值。在该函数中,该堆栈帧与其所有值保持一致;当函数终止时,通常会丢弃堆栈帧并返回到下一层。在这种情况下,“abc”进入f()的堆栈帧,但C++足够聪明,可以将它分配到父代的堆栈帧的旁边;当从堆栈中弹出f()时,g()(它直接在堆栈中的f()之下的堆栈帧,因为调用g()调用f())以挂起值“abc”。

这描述了在堆栈上分配的对象;另一种选择是堆中的对象,它们是持久的。堆上的对象使用'new'和'delete'进行管理,并由指针或堆引用保存。当您完成该功能时,堆栈对象将自动释放;必须手动释放堆中的对象。

2

基于堆栈的引用是一个引用,它是块内部的函数调用的参数或局部非静态变量。所有其他参考不是基于堆栈的。

int foo; 
static int &fooref = foo; // Not stack based. 

class A { 
public: 
    A(int &z) : x(z) {} // z is stack based, x isn't. 
    int &x; // Not stack based. 
}; 

void joe(int &i) { // i is stack based. 
    int &k = i; // k is stack based. 
    static int &j = i; // j is not stack base and this will likely result in a bad error later. 
    A a(k); // a is stack based, but A.x still isn't. 
}