[转] C++临时变量的生命周期

http://www.cnblogs.com/catch/p/3251937.html

C++中的临时变量指的是那些由编译器根据需要在栈上产生的,没有名字的变量。

主要的用途主要有两类:

1) 函数的返回值, 如:

 1 string proc()
 2
 3 {
 4
 5     return string("abc");
 6
 7 }
 8
 9
10
11 int main()
12
13 {
14
15     proc();
16     return 0;
17
18 }

其中第15行会产生一个临时变量。但并不是所有返回值都会创建临时变量,只有当没有将返回值赋值给其它变量时,临时变量才会创建。

这种临时变量的生命周期很短,当表达式完成后,它就会被销毁了。例如上面的代码,15行产生的临时变量,16行的时候就已经销毁了。

2) 类型转换时的中间变量。

1 int a = 3;
2
3 float k = 2.0;
4 float f = k + a;

第4行,k+a 由于是 float + int , int 会被转换成 float 再与 k 相加,这个时候就会生产一个临时变量。上面的例子是 build-in type,但对于自定义的类也是同样适用的。

一般来说,C++ 中的临时变量在表达式结束之后 (full expression) 就被会销毁,比如前面举的两个栗子,但也有例外的时候,如果这个临时变量被用来初始化一个引用的话,那这个临时变量的生命周期就会被延长,直到引用被销 毁,从而不会因此产生悬空(dangling)的引用。

 1 string Proc()
 2 {
 3      return string("abc");
 4 }
 5
 6 int main()
 7  {
 8      const string& ref = Proc();
 9      cout << ref << endl;
10      return 0;
11  }

如上,第8行产生的临时变量因为有ref指向,它的生命周期会延长至直到main()返回。

这个特性有时很有用,比如,你可以用一个基类的引用指向一个子类的临时变量,然后通过这个引用来实现多态,但又不用处理子类的销毁。

 1 Class Base()
 2 {
 3     public:
 4
 5          virtual Bar() { cout << "base bar()" << endl; }
 6 };
 7
 8 Class DerOne: public Base
 9 {
10     public:
11
12        virtual Bar() { cout << "DerOne Bar()" << endl; }
13 };
14
15 class DerTwo: public Base
16 {
17     public:
18
19        virtual Bar() { cout << "DerTwo Bar()" << endl; }
20 };
21
22
23 Base GetBase()
24 {
25     return Base();
26 }
27
28 DerOne GetDerOne()
29 {
30      return DerOne();
31 }
32
33 DerTwo GetDerTwo()
34 {
35      return DerTwo();
36 }
37
38
39 int main()
40 {
41     const Base& ref1 = GetBase();
42     const Base& ref2 = GetDerOne();
43     const Base& ref3 = GetDerTwo();
44
45     ref1.Bar();
46     ref2.Bar();
47     ref3.Bar();
48
49     return 0;
50 }

该小技巧在 Loki::ScopeGuard 的实现中被用到了,使得在一个域内使用多态时,可以避免使用指针,这个写法是这样的巧妙以致被 Andrei 称为:"The Most Important const"。不过需要注意的是,临时变量只能通过 const 引用来指向,因此是不可修改的。

时间: 2024-08-26 05:33:07

[转] C++临时变量的生命周期的相关文章

[转]Android静态变量的生命周期

原文地址:https://my.oschina.net/jerikc/blog/137207 Android是用Java开发,其静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区.当类被卸载的时候,静态变量被销毁.在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束.那么在Android中呢?用的Dalvik vm也是一样的.不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值

变量的生命周期

变量不仅有其特定的作用范围,还有其存活的周期--生命周期.变量的生命周期指的是变量可被使用的一个时间段,在这个时间段内变量是有效的,一旦超出这个时间段变量就会失效,我们就不能够再访问到该变量的值了. PHP对变量的生命周期有如下规定. 局部变量的生命周期为其所在函数被调用的整个过程.当局部变量所在的函数结束时,局部变量的生命周期也随之结束. 全局变量的生命周期为其所在的".php"脚本文件被调用的整个过程.当全局变量所在的脚本文件结束调用时,则全局变量的生命周期结束. 有的时候某个自定

android中少用静态变量(android静态变量static生命周期)

在android中,要少用静态变量. 我现在做的一个应用中,之前的开发人员使用静态变量来存储cookie,这个全局的静态变量用来验证身份. 这时客户反应,应用长时间不使用,再次使用,会提示身份过期. 后来经查,问题基本确定在静态变量上. 上stackoverflow查了android中static变量的生命周期,有人这么说 Lifetime of a static variable: A static variable comes into existence when a class is l

C++旧源码向新标准移植陷井(一)_局部栈变量的生命周期

之前在VC++6.0上面写了下面这样的代码: int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; //不重要的部分略过if (argc>1) {if (strcmp(argv[1],"createpcsstep") == 0) { CDlgCreateStepPcs dlg; dlg.DoModal(); break; } else if (strcmp(argv[1],"clea

生命周期,作用域的定义;说明全局变量、静态变量、局部变量、const变量的生命周期、作用域

生命周期,作用域的定义:说明全局变量.静态变量.局部变量.const变量的生命周期.作用域: 生命周期:是一个变量存在的周期. 作用域:是一个变量可以被引用的范围.最常见的如:{}.static修饰符等等. 1)全局变量: 作用域:全局作用域(只需要在一个源文件中定义,就可以作用于所有的源文件): 生命周期:程序运行期一直存在: 引用方法:其他文件如果要使用,必须用extern 关键字声明要引用的全局变量: 内存分布:全局(静态存储区). 注意:如果再两个文件中都定义了相同名字的全局变量,则连接

Android中静态变量的生命周期

静态变量的生命周期,起始于类的加载,终止于类的释放.什么时候类会加载呢?我们知道,在app打开时,会创建一个进程,然后初始化一个dvm的实例,负责类的加载释放 和 垃圾回收等.换句话说,在进程创建之后,就会加载类,静态变量诞生了.那何时释放?当然是在类卸载的时候.同上面.在进程结束之前,静态变量就寿终正寝.我们知道,Android中,你是不知道何时进程会被Kill.所以1.不能保证静态变量会一直存在.(进程可能被Kill掉)2.每次打开app时静态变量的值都是初始值(进程没有被kill掉所以静态

js变量的生命周期

变量的生命周期 1.声明 全局变量:全局声明的变量局部变量:函数内声明的变量,函数参数 声明局部变量的时候必须用var,否则产生的是全局变量 1 scope = "global"; 2 function checkscope2() { 3 scope = "local"; 4 myscope = "local"; 5 } 6 checkscope2(); 7 console.log(scope);//输出local,全局变量被修改 8 conso

函数变量的生命周期

#!/usr/bin/env python #coding:utf-8 #@Author:Andy # Date: 2017/6/14 # x = 1 # def foo(): # x = 10000 # print(x) # # foo() # print(x) 运行上面的代码会先后打印出:10000, 1.执行foo函数后,x=10000的生命周期在foo函数内部,当此函数执行完后即消失,接着执行print(x), 此时内部的x=10000已经销毁,只有全局变量x=1,所以打印1 x=1 d

asp.net静态变量的生命周期和线程安全

void Application_Start开始 void Application_End结束的,本来这就是对的 今天要做一个全局的应用,想确认一下,在网上一找,我的天,说什么的都有 大概分三种 1.Application_Start——Application_End 2.Session_Start——Session_End 3.类生命周期结束 我用4个机器做了一个测试发现静态变量值一直是不变的,并没有因为其它用户登录而被销毁,确认应该是Application级的 静态类在首次访问时会调用静态构