VC编程:VC6.0和VC2012的全局对象的释放!!!
小标 2018-08-14 来源 : 阅读 1366 评论 0

摘要:本文主要向大家介绍了VC编程:VC6.0和VC2012的全局对象的释放!!!,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程:VC6.0和VC2012的全局对象的释放!!!,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

大家都知道,全局对象的生命周期是整个Process,Process终了时系统回收空间,全局对象的构造是在main()函数之前,析构是在main()函数返回后进行的。今天发现在VC6.0和VC2012中是有区别的。


(1)测试代码:

文件a.h,a.cpp,main.h,main.cpp代码如下

#pragma onceclass A{public: A(); ~A();};
#include <iostream>#include "a.h"A::A(){ std::cout << "A construct.\n";}A::~A(){ std::cout << "A deconstruct.\n";}
#pragma onceclass 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()。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved