大家都知道,全局對象的生命周期是整個Process,Process終了時系統回收空間,全局對象的構造是在main()函數之前,析構是在main()函數傳回後進行的。今天發現在VC6.0和VC2012中是有差別的。
(1)測試代碼:
檔案a.h,a.cpp,main.h,main.cpp代碼如下
#pragma once
class A
{
public:
A();
~A();
};
#include <iostream>
#include "a.h"
A::A()
{
std::cout << "A construct.\n";
}
A::~A()
{
std::cout << "A deconstruct.\n";
}
#pragma once
class B : public A
{
public:
B();
~B();
};
//author:chen_jintao
//注意:includeの使い方、順序
#include <iostream>
#include "a.h"
#include "main.h"
B::B()
{
std::cout << "B construct.\n";
}
B::~B()
{
std::cout << "B deconstruct.\n";
}
B theB;//全局對象定義
void main()
{
std::cout << "main() function is over.\n";
return;
}
(2)測試結果:
a)VC6.0中的執行結果:
b)VC2012中執行結果:
(3)結果分析:
從VC6.0的執行結果來看A、B的析構函數沒有調用,其實析構函數确實是調用了,這是VC6.0對C++标準庫支援的一個bug。這是因為std這個對象在main函數退出後已經釋放掉了,是以A、B析構函數的“std::cout<<”沒有輸出。
大家可以用下面2種方式去确認:
1.直接使用include<iostream.h>代替include<iostream>,調用cout<<。
2.用的C++封裝的C的标準庫,include<cstdio>或者直接include<stdio.h>,調用printf()。