美文网首页C/C++知识点
一个例子记住C++对象的生存周期

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

作者: Python编程导师 | 来源:发表于2019-01-19 20:47 被阅读6次

代码

代码说明:

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

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

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

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

#include <iostream>

#include <string.h>

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");前面,则输出时两者顺序也颠倒。

有兴趣一起交流学习c/c++的小伙伴可以加群:466572167,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!

分析

(1)创建顺序

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

(2)销毁顺序

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

内存的三种分配方式

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

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

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

相关文章

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

    代码 代码说明: 类A,含构造函数和析构函数 普通函数fun,函数体里新建了类A的局部自动对象FunObj和局部静...

  • C++、OC混编对象生命周期

    本人在C++和OC混编时对于两者对象生命周期有些疑惑,特别是OC对象作为C++对象成员的时候,C++对象会不会接管...

  • session对象的生存周期

    session对象的生存期限依赖: * 客户是否关闭浏览器。 * session对象是否调用invalidata(...

  • 233对象的销毁

    1、对象的生存周期 对象在内存中不断的“生生死死”,具有生命周期 2、对象在内存中的状态

  • C++ 类和对象的使用

    一个例子看懂C++ 类和对象的使用,由于自己写Java比较多,对C++类和对象的使用不是很熟练,记录下代码,按自己...

  • 2018-05-24 学习对象初始化

    一.生命周期 一个对象的生命周期有诞生(通过alloc或者new方法实现)、生存(接收消息和执行操作)、交友(借助...

  • UML—状态图,State

    1、概念 状态图通过建立类对象的生存周期模型来描述对象随时间变化的动态行为。状态是指对象在生命周期中满足某些条件、...

  • Spring 简介

    IOC AOP 最核心的功能 管理对象 管理对象的生存周期和对象的关系 Spring IOC容器 一 概念 1 j...

  • IOS 成员变量,全局变量,局部变量定义,static与exte

    1,先说定义 1)成员变量定义:生存与该类的生命周期,变量存活周期跟你定义的该类实体对象一样;作用域是整个实体对象...

  • JVM又曾对谁宽容过,垃圾终将被回收!

    背景 1、对象的生存周期 1.1宏观视角 1.2微观视角 1.3对象引用 2、垃圾(对象)判断 2.1引用计数算法...

网友评论

    本文标题:一个例子记住C++对象的生存周期

    本文链接:https://www.haomeiwen.com/subject/sfzadqtx.html