`
隐形的翅膀
  • 浏览: 505164 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

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

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


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

销毁

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

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

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

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

    从main()中返回
    调用exit()
    调用abort()
    抛出一个异常

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

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

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

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

相关推荐

    深度探索C++对象模型读书笔记

    构造和销毁是对象生命周期的重要环节,复制则涉及到对象的深拷贝与浅拷贝等问题。 ##### 6.1 无继承下的对象构造 - **对象构造过程**:讨论在无继承情况下对象如何被构造。 - **构造顺序**:解释构造函数的调用...

    深度探索C++对象模型

    构造函数和析构函数是C++中用于初始化和清理对象的重要机制。构造函数在对象创建时自动调用,用于初始化对象的状态;而析构函数在对象销毁前调用,用于释放对象占用的资源。深入理解构造函数和析构函数的调用时机和...

    The Annotated C++ Reference Manual

    这部分详细解释了μC++中基本执行单元的特性和行为,包括但不限于进程、线程、协程等的创建、销毁以及它们之间的通信机制。理解这些基本执行属性是构建复杂并发系统的基础。 #### 1.3 高级执行构造 此章节聚焦于μ...

    当析构函数遇到多线程── C++ 中线程安全的对象回调 PDF

    C++作为一种需要程序员手动管理对象生命周期的语言,在多线程环境中尤其需要谨慎处理对象的创建和销毁过程。由于多线程环境下对象可能被多个线程共享访问,因此对象的销毁时机可能会变得难以确定,导致出现多种竞态...

    300道C++题目

    通过定义类,可以创建出具有相同特性和行为的不同实例(对象),这极大地简化了代码的复用性。 **3. 对象的特征** - **静态特征**:指的是对象的状态或属性,例如一个学生对象可能具有的姓名、年龄等属性。 - **...

    C++知识点学习

    - **析构函数**:在对象销毁前被调用,用于释放资源。 - **赋值运算符**:用于已存在的对象之间赋值操作。 #### 八、拷贝构造函数的调用场景 拷贝构造函数主要在以下几种情况下被调用: 1. 使用一个对象初始化另一...

    《C++程序设计》的复习题

    15. **构造函数和析构函数的调用时机**:构造函数在对象创建时自动执行,析构函数在对象销毁时自动执行。 16. **析构函数调用**:删除指向类动态对象的指针时,如`delete p;`,系统会调用析构函数释放内存。 17. *...

    c++面试必须知道的问题.

    掌握`this`指针的使用对于编写复杂的类和对象模型至关重要。 ### 7. C++中的运算符重载 运算符重载允许将内置运算符应用于用户定义的类型,使其能够像内置类型一样工作。然而,过度使用或不当使用运算符重载可能...

    C++期末练习题.docx

    知识点:C++ 析构函数,对象销毁,内存释放。 6. 若需要把一个函数”void F();”定义为一个类 AB 的友元函数,则应在类 AB 的定义中加入一条语句:friend void F(); 知识点:C++ 友元函数,类友元关系,访问权限。...

    C++实验二--封装性.doc

    同时,类中包含了构造函数和析构函数,用于对象创建和销毁时的初始化和清理工作。 构造函数是类的一个特殊函数,它的名字与类名相同,没有返回类型,通常用于初始化对象的状态。在这个实验中,构造函数接受三个参数...

    C++ 300题 必会

    - **作用**:这些函数由编译器自动生成,用于处理对象的创建、复制和销毁等任务。 #### 8. 拷贝构造函数的应用场景 - **初始化对象**:当一个对象用来初始化另一个同类对象时。 - **函数参数传递**:当函数的参数是...

    C++中譯本part1

    - 对象名和对象引用使用`.`操作符。 - 指针使用`->`操作符。 **3. 构造函数(Constructor)与默认参数** - 构造函数是一种特殊的成员函数,用于初始化新创建的对象。 - 可以为构造函数的参数提供默认值,这样在...

    c++ 笔试题

    C++是一种强大的面向对象编程语言,它在软件...以上知识点涵盖了C++中基础的面向对象特性、类和对象、构造和析构、成员函数、运算符重载、多态以及内存管理等方面,理解并掌握这些知识点对于解决C++笔试题至关重要。

    C++面试题全集

    这些函数为类提供了基本的操作能力,如对象的创建、复制和销毁等。 #### 8. 拷贝构造函数的调用时机 拷贝构造函数主要用于对象的复制过程。具体来说,它会在以下三种情况下被调用: - 当一个对象初始化另一个同...

    C++析构函数 快速学习

    当你创建一个对象,并使用new关键字动态分配内存时,你需要确保在不再需要该对象时将其删除,以避免内存泄漏。析构函数在对象销毁前自动执行,可以确保在适当的时间释放这些内存。 C++中,有两种类型的析构函数:非...

    C上机实验报告实验三.docx

    这种实践有助于理解对象创建和销毁时发生的事件,以及成员函数的调用顺序。 在选做部分,我们设计了一个`People`类,它抽象出人员的基本信息,如编号、性别、生日和身份证号。为了提高通用性,我们还定义了一个...

    c++必会面试300题

    8. **拷贝构造函数的调用时机**:拷贝构造函数在创建新对象并使用已有对象初始化时、函数参数传递和函数返回值时被调用。 9. **构造函数**:构造函数用于初始化对象,名称与类名相同,没有返回类型。构造函数的主要...

    c++面试题全集收集的比较齐全的面试题

    它可以被看作是创建对象的模板或蓝图,定义了这些对象的公共属性和方法。 3. **对象的特征** - 每个对象都有两个基本特征:静态特征(如成员变量,描述对象的状态)和动态特征(如成员函数,描述对象的行为)。...

Global site tag (gtag.js) - Google Analytics