C++对象创建和销毁的时机和顺序


根据变量的作用域(Scope)和其代表对象的生命期(Storage Duration)可将变量分为三种。

非局部变量: 定义在函数之外的变量,如全局作用域中的变量,命名空间作用域中的变量,类的静态成员变量。

局部静态变量: 定义在函数内的静态变量。

局部非静态变量: 定义在函数内的非静态变量。

创建

非局部变量在main()函数调用之前创建。

局部静态变量和局部非静态变量都在程序第一次执行到变量定义的地方时创建,创建的顺序和它们在代码中的执行顺序相同。

销毁

析构时,变量按照它们构造相反的顺序进行。只有已经构造过的那些变量的析构器才有可能被执行。

非局部变量和局部静态变量的析构发生在main()调用完成之后。

局部非静态变量的析构发生在程序离开变量所在的作用域之际。

正常情况下,一个C++程序的结束方式有一下几种:

从main()中返回

调用exit()

调用abort()

抛出一个异常

在程序以从main()中返回结束执行的情况下,已经构造过的各类变量的析构器得以执行。

在调用标准库中的exit()结束程序的情况下,非局部变量和局部静态变量(这两种变量的生命期都持续到程序结束)的析构有机会得到执行。但局部非静态变量的析构器没有机会得到执行。

在调用abort()终止程序的情况下,所有变量的析构器没有机会得到执行。

当有异常抛出,程序转入异常处理器中的时候,离开的作用域内部的局部非静态变量的析构器被执行。之后的程序是否结束依赖于异常处理器中的代 码逻辑,其作用域内的局部非静态变量,以及storage duration持续到程序结束的那些变量的析构器是否得以执行也可以根据上面的规则再做进一步的判断。

相关内容