C++对象的生存周期

本文分析了C++中对象的生存周期,包括创建顺序和销毁顺序。主要内容包括:代码示例展示了类A的构造函数和析构函数的使用,以及在不同作用域(局部自动对象、局部静态对象、外部静态对象和外部对象)中的行为。内存分配分为静态存储区、栈区和堆区,各有特点。静态存储区的变量在程序运行期间始终存在,栈区的内存自动分配和释放,而堆区的内存需要手动管理,可能导致内存泄漏。
摘要由CSDN通过智能技术生成

转自:http://blog.jobbole.com/99484/


代码

代码说明:

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

分析

  • 创建顺序
    外部静态对象or外部对象优先于main函数
  • 销毁顺序
    和创建顺序相反,注意静态对象会在main函数执行完才会销毁

内存的三种分配方式

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


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值