四种不同对象的生存方式(栈、堆、全局、局部静态)

简介: 四种不同对象的生存方式

四种不同对象的生存方式(栈、堆、全局、局部静态)

//东软2012-11月笔试题

class Sample
{
       int x;
public:
      Sample(int a)
       {
              x = a;
              cout << "constructing object: x =" << x << endl;
       }
};
 
void func(int n)
{
       static Sample obj(n);
}
 
int main()
{
       func(1);
       func(10);  //1
       return 0;
 
}

image.png
           

[分析]:题目的考查点,静态对象的创建及执行。类中的静态对象只会执行一次,这是输出上面结果的原因。

[扩展分析]:此种静态对象的题目之前在360面试的时候被问到过,后来在《深入浅出MFC》基础部分讲解C++重要性质之——C++程序的生与死:兼谈构造函数与析构函数部分的示例很能说明问题。
笔者对示例稍稍做了扩充,如下:

  class CDemo
{
public:
       CDemo(const char* str);
       ~CDemo();
       void showObjectName();   //显示对象名。
 
private:
       char name[20];
};
 
 
CDemo::CDemo(const char* str)
{
      strncpy_s(name,str,20);
       cout << "Constructor called for " << name << "\n";
}
 
CDemo::~CDemo()
{
       cout << "Destructor called for " << name << "\n";
};
 
void func()
{
       CDemo LocalObjectInFunc("LocalObjectInFunc"); //5  //10
       static CDemo staticObject("StaticObject"); //6   
       CDemo* pHeapObjectInFunc = new CDemo("HeapObjectInFunc"); //7 //11
       cout << "Inside func" << endl; //8 //12
} //9析构LocalObjectInFunc //13析构LocalObjectInFunc
 
void CDemo::showObjectName()   //显示对象名
{
       cout << name << "\n";
}
 
CDemo GlobalObject("GlobalObject"); //1
 
int main()
{
       CDemo localObjectInMain("LocalObjectInMain");  //2
       CDemo* pHeapObjectInMain = new CDemo("HeapObjectInMain"); //3
 
       cout << "In main, before calling func\n\n\n"; //4
       func();
       cout << "\n\n";                             //13'
 
       func();                 //staticObject静态对象已经存在,不再创建!                                    
       cout << "\n\nIn main, after calling func\n";  //14
 
       //test作用域
       //staticObject.showObjectName();  //error C2065: “staticObject”: 未声明的标识符
       //cout << "In main, after GlobalObject.showObjectName(): ";
       //GlobalObject.showObjectName();
 
       return 0;
}//15析构localObjectInMain //16析构staticObject //17析构GlobalObject

 
执行结果如下:

image.png
     

[结果分析,引申出四种对象]:

生存方式 执行时机 消亡时机
全局(静态)对象 全局静态存储区 global 比程序进入点更早,构造函数先被执行; 程序结束前,其析构函数被执行。
局部静态对象 局部静态存储区 local static 在对象诞生时,其构造函数被执行。(注意,此处只会有一个实例产生,而且固定在内存上(非stack也非heap),它的构造函数在控制权第一次移转到其声明处时被调用。 程序将结束时(此对象因而将遭致毁灭)其析构函数才被执行,但比全局对象的析构函数更早一步执行。
局部对象 栈区 stack 在对象诞生时,其构造函数被执行。(同局部静态对象) 程序流程将离开该对象的存活范围时(以至于该对象将销毁)时,其析构函数被执行。
new方式产生的局部对象 堆区 heap 当对象诞生时,其构造函数被执行。(同局部静态对象、局部对象) 在对象被delete时执行析构函数。(注意,不加delete该heap区空间不会自动释放的,如果程序长期运行,会“吃掉”很多内存,造成结果不可预知。)

[静态对象的深入探究(全局、局部)]

 
88C410F0-06DF-4f4e-B555-6B3ECBBF7551.png


作者:铭毅天下
来源:CSDN
原文:https://blog.csdn.net/laoyang360/article/details/8185172
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
2天前
|
算法 Java 机器人
Java数据结构与算法:最大堆
Java数据结构与算法:最大堆
|
2天前
|
算法 Java 机器人
Java数据结构与算法:最小堆
Java数据结构与算法:最小堆
|
3天前
|
C++
【洛谷 P1044】[NOIP2003 普及组] 栈 题解(递归+记忆化搜索)
**NOIP2003普及组栈问题**:给定操作数序列1到n,仅允许push(进栈)和pop(出栈)操作。目标是计算所有可能的输出序列总数。输入包含一个整数n(1≤n≤18)。示例输入3,输出5。当队列空时返回1,栈空则只能入栈,栈非空时可入栈或出栈。AC C++代码利用记忆化搜索求解。
6 1
|
2天前
|
缓存 调度
栈和队列的区别
栈和队列的区别
5 0
|
3天前
|
存储 程序员 编译器
堆和栈的区别
堆和栈的区别
|
3天前
|
Python
数据结构===堆
数据结构===堆
|
3天前
|
C++
【洛谷 P1739】表达式括号匹配 题解(栈)
该编程题目要求检查给定的包含字母、运算符和括号的表达式是否括号匹配。输入为一行表达式,以`@`结束。如果括号匹配,输出`YES`,否则输出`NO`。样例包括一个匹配和一个不匹配的表达式。解决方案是使用栈,遇到左括号入栈,遇到右括号时判断栈是否为空,栈空则输出`NO`,否则出栈。当读到`@`时,栈空则输出`YES`,否则输出`NO`。提供的AC代码使用C++实现,通过`stack`处理括号匹配。
5 0
|
3天前
|
存储 Java Python
数据结构===栈
数据结构===栈
|
4天前
|
索引
栈的数组实现
栈的数组实现
4 0
|
9天前
数据结构——栈和队列
数据结构——栈和队列
10 1