天天看點

VC6.0和VC2012的全局對象的釋放!!!

大家都知道,全局對象的生命周期是整個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中的執行結果:

VC6.0和VC2012的全局對象的釋放!!!

   b)VC2012中執行結果:

VC6.0和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()。

繼續閱讀