静态对象的析构

#include<iostream>
#include<stdio.h>
class staticClass
{
public:
 
 staticClass()
 {
    printf("Initialize!\n");
   // std::cout<<"Initialize!"<<std::endl;
 }
 ~staticClass()
 {
  printf("Clear up!\n");
 // std::cout<<"clear up!"<<std::endl;//这句话输不出来
 }
};

static staticClass *mm=new staticClass();
static staticClass xx;

int main()
{
 std::cout<<"Hello word!"<<std::endl;
 
    //delete mm;
   // int x;
  // std::cin>>x;
 return 0;
}
1.这个程序本来应该输出两次 celar UP的,

可是实际运行的时候只显示一次clear up,不知道为什么?

2.当注释掉static staticClass时 就不输出clear up,由此断定 new的对象没有调用类的析构函数

3

class staticClass
{
public:
 
 staticClass()
 {
    printf("Initialize!\n");
   // std::cout<<"Initialize!"<<std::endl;
 }
 ~staticClass()
 {
 // printf("Clear up!\n");
  std::cout<<"clear up!"<<std::endl;//这句话输不出来
 }
};

//static staticClass *mm=new staticClass();
static staticClass xx;

int main()
{
 std::cout<<"Hello word!"<<std::endl;
 
    //delete mm;
   // int x;
  // std::cin>>x;
 return 0;
}不会输出clear

cout是个对象,在main程序结束时先析构,因此不会输出

http://bbs.csdn.net/topics/310132783

 

下面这几句很经典(菜鸟这样认为)

1 为什么程序终止时会自动调用析构函数
>> a1是全局变量,全局变量的声明周期比main函数还长,当程序结束后系统要回收内存,因此会自动调用其析构函数。
2 如果这个对象是在.Net环境中定义的,那么.Net的垃圾收集器会不会对这个对象采用同样的收集方式(在gc认为合适的时候进行回收)。提出这个问题的目的是:如果答案是“yes”,那么显式调用~A()就有意义,否则没有意义 
>> 反问一句:既然可以自动回收了,那为什么还要显式调用析构函数呢?
3 我在main函数中定义了A*   pa=&a1 
  随后调用delete(pa)为什么会崩溃?难道会和第一个问题有关?即因为程序终止前a1已经被显式释放,所以到程序自动调用析构函数时该对象实际已经不复存在了 
>> 根据C++的标准
>> A* pa = &a1;
>>  delete pa;
>>  后面的delete pa;这样的写法是没有确切定义的,十有八九是错误的。一句话,没有new就没有delete
>>  和前面是否显示调用了析构函数没有什么关系。
>>
>>  楼上“A*  pa=&a1 ,这个a1是stack上的变量,不是heap上的,不能用delete。”是很正确的,
>> 顺便补充一下:在栈上的变量或者对象是有系统自动构造和析构的,在堆上的对象是要靠程序自己来构造
>> 和析构的。

你可能感兴趣的:(C++,c,对象)