我在理解变量生命周期和绑定生命周期的概念时遇到了问题。
考虑以下任意函数
可变寿命
生命周期是对象/变量分配内存的持续时间。
绑定生命周期。
创造和毁灭之间的时间段 名称到对象绑定的名称称为绑定的生命周期。
考虑以下任意函数。我会把我的问题作为评论
void foo (int j)
{ // Does i's lifetime start here?
int i; // Or does i's lifetime start her?
i = j; // does binding lifetime start here?
} // i's lifetime ends
- 换句话说,我的生命是否以阻止" {}"开始和结束?或者从decleration开始(int i;)并以"}"结束。
答案 0 :(得分:1)
我的生命是否开始和结束了块" {}"或者从声明(
int i;
)开始,以"}"结束。
来自C ++ 11标准:
3.8对象生命周期[basic.life]
1对象的生存期是对象的运行时属性。如果一个对象属于类或聚合类型,并且它或其成员之一由除了普通默认构造函数之外的构造函数初始化,则称该对象具有非平凡的初始化。 [注意:通过简单的复制/移动构造函数进行初始化是非平凡的初始化。 - 结束记录]
类型为
T
的对象的生命周期始于:
- 获得具有T
类型的正确对齐和大小的存储,以及
- 如果对象具有非平凡的初始化,则其初始化完成。类型
T
的对象的生命周期在以下情况下结束:
- 如果T
是具有非平凡析构函数(12.4)的类类型,则析构函数调用将启动,或者 - 对象占用的存储空间被重用或释放。
这是一个示例程序及其输出:
#include <iostream>
struct Foo
{
Foo() : id(getNextID()) {}
~Foo()
{
std::cout << "Destroying object " << id << std::endl;
}
int id;
static int getNextID()
{
static int nexID = 0;
return ++nexID;
}
};
Foo bar()
{
throw(10);
return Foo();
}
int main()
{
int i = 10; // Lifetime starts as soon as function is entered.
try
{
Foo f1; // Lifetime starts after initialization is completed.
Foo f2 = bar(); // Lifetime does not start at all
int k = 20; // Lifetime starts as soon as function is entered
// even though it is not initialized.
}
catch ( ... )
{
}
return 0;
}
输出:
Destroying object 1
答案 1 :(得分:1)
变量/对象的生命周期和绑定时间有时可以相同。例如,当变量/对象通过引用传递给子例程时,通常会看到差异。变量/对象仍保留其值,但您无法再通过名称访问它。换句话说,参数名称和传递的变量之间的时间比变量本身的寿命短。
01 void addOne(int &y) // y created here
02 {
03 y = y + 1;
04 } // y is destroyed here
05
06 int main()
07 {
08 int x = 5;
09 std::cout << "x = " << x << '\n';
10 addOne(x);
11 std::cout << "x = " << x << '\n'; //y's value is displayed here
12 return 0;
13 }
结果:
x = 5
x = 6
y的变量生命周期包括main()和addone(),但y在01和04行之间具有绑定生命周期。