您的位置:首页 > 编程语言 > C语言/C++

C++ 对象生命周期

2016-08-25 11:23 726 查看


代码

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

main方法新建了类A的局部自动对象
MainObj
,调用
fun
方法
外面新建了A的的外部静态对象
ExStaObj
和外部对象
GblObj


[cpp] view
plain copy

 





#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");
 

输出:



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


分析

创建顺序

外部静态对象or外部对象优先于main函数
销毁顺序

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


内存的三种分配方式

从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储
在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限
在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: