博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个例子记住C++对象的生存周期
阅读量:6933 次
发布时间:2019-06-27

本文共 1533 字,大约阅读时间需要 5 分钟。

一个例子记住C++对象的生存周期

标签 : c++ examples


[TOC]


最近要考C++,复习过程中遇到一些问题,总结记录一下。文中代码均在中运行的。

代码

代码说明:

  • 类A,含构造函数和析构函数

  • 普通函数fun,函数体里新建了类A的局部自动对象FunObj和局部静态对象InStaObj

  • main方法新建了类A的局部自动对象MainObj,调用fun方法

  • 外面新建了A的的外部静态对象ExStaObj和外部对象GblObj

#include 
#include
using namespace std;class A { char string[50];public : A(char * st); ~A( );};A::A(char * st){ strcpy(string, st); cout << string << "被创建时调用构造函数 ! " << endl;}A::~A( ){ cout << string << "被撤消时调用析构函数 ! " << endl;}void fun( ){ cout << "在fun( )函数体内 : \n" << endl; A FunObj("fun( )函数体内的自动对象FunObj"); static A InStaObj("内部静态对象InStaObj");}int main( ){ A MainObj("主函数体内的自动对象MainObj"); cout<<"主函数体内,调用fun()函数前: \n"; fun( ); cout << "\n主函数体内,调用fun()函数后:\n"; return 0;}static A ExStaObj("外部静态对象ExStaObj");A GblObj("外部对象GblObj");

输出:

外部静态对象ExStaObj被创建时调用构造函数 ! 外部对象GblObj被创建时调用构造函数 ! 主函数体内的自动对象MainObj被创建时调用构造函数 ! 主函数体内,调用fun()函数前: 在fun( )函数体内 : fun( )函数体内的自动对象FunObj被创建时调用构造函数 ! 内部静态对象InStaObj被创建时调用构造函数 ! fun( )函数体内的自动对象FunObj被撤消时调用析构函数 ! 主函数体内,调用fun()函数后:主函数体内的自动对象MainObj被撤消时调用析构函数 ! 内部静态对象InStaObj被撤消时调用析构函数 ! 外部对象GblObj被撤消时调用析构函数 ! 外部静态对象ExStaObj被撤消时调用析构函数 !

若将A GblObj("外部对象GblObj"); 写在static A ExStaObj("外部静态对象ExStaObj");前面,则输出时两者顺序也颠倒。

分析

  • 创建顺序

    外部静态对象or外部对象优先于main函数

  • 销毁顺序

    和创建顺序相反,注意静态对象会在main函数执行完才会销毁

内存的三种分配方式

  • 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储

  • 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限

  • 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题

内存分配

作者更多文章: | |

转载地址:http://nqmjl.baihongyu.com/

你可能感兴趣的文章
java内存
查看>>
实习日记7.28
查看>>
JavaScript测试工具比较: QUnit, Jasmine, and Mocha
查看>>
调试4
查看>>
我在Eclipse中使用Tomcat插件的遇到的一些问题
查看>>
FWT
查看>>
yum安装mysql后root用户的临时密码
查看>>
GridView使用技巧之:新增记录、GridView内数据验证、删除信息提示
查看>>
六、JVM命令和工具
查看>>
(Java后端 Java web)面试时如何展示自己非技术方面的能力(其实就是综合能力)...
查看>>
selenium切换到iframe
查看>>
项目选题报告
查看>>
Codeforces 785D - Anton and School - 2(组合数学)
查看>>
.net调用存储过程详解
查看>>
性能测试如何计算设置并发数
查看>>
Linux下chkconfig命令详解
查看>>
重定位子进程的标准输出至管道
查看>>
cookies的常见方式
查看>>
SQL获取当月天数的几种方法
查看>>
typescritp 导出默认接口
查看>>