前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++对象产生和销毁的顺序

C++对象产生和销毁的顺序

作者头像
恋喵大鲤鱼
发布2019-02-22 14:39:42
1.4K0
发布2019-02-22 14:39:42
举报
文章被收录于专栏:C/C++基础C/C++基础

C++中,如果对象是用new操作生成的,那么它的空间被分配在堆(Heap)上,只有显示地调用delete(或delete[])才能调用对象的析构函数并释放对象的空间。那么,在程序的其他存储区(Data段,Stack)上的对象依据什么样的顺序产生和销毁的呢?

考察如下程序。

#include <iostream>
#include <string>
using namespace std;

class A
{
    string name;
public:
    A(string s) 
    {
        name=s;
        cout<<"object "<<name<<" has been created"<<endl;
    }
    ~A(){
        cout<<"object "<<name<<" has been destroyed"<<endl;
    }
};

void func1() 
{
    static A sa1("static_object_1");
}

void func2(){
    static A sa2("static_object_2");
}

int main(int argc,char* argv[])
{
    A la1("local_object_1");
    A la2("local_object_2");
    func1();
    func2();

    getchar();
}
A a1("global_object_1");
A a2("global_object_2");

程序运行结果:

object global_object_1 has been created
object global_object_2 has been created
object local_object_1 has been created
object local_object_2 has been created
object static_object_1 has been created
object static_object_2 has been created
object local_object_2 has been destroyed
object local_object_1 has been destroyed
object static_object_2 has been destroyed
object static_object_1 has been destroyed
object global_object_2 has been destroyed
object global_object_1 has been destroyed

阅读以上程序的时候,注意以下几点: (1)全局对象或全局静态对象不管是在什么位置定义的,它的构造函数都在main()函数之前执行。 (2)局部静态对象的构造函数是当程序执行到定义该对象时才被调用。 (3)所有在栈(stack)上的对象都比在全局或静态对象早销毁。 (4)不管是在栈上的对象,还是全局或静态对象,都遵循这样的顺序:越是先产生的对象越是后被销毁。


参考文献

[1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[3.15(P180-P181)]

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年10月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档