今天遇到了一个很奇怪的问题,我的电脑是win7+64专业版的,在VC6.0上调试MFC程序,最后程序关闭的时候,弹出下述警告

但是在Release版本不会出现这个问题,最关键的是在同学电脑(Win7+64旗舰版)无论是Debug还是Release都没问题,弄得我差点重装系统。
后来,进入提示中的filecore.cpp(这是VC6.0软件自己的文件)的295行,程序如下

void CFile::Close()
{ASSERT_VALID(this);ASSERT(m_hFile != (UINT)hFileNull);//这里报错了BOOL bError = FALSE;if (m_hFile != (UINT)hFileNull)bError = !::CloseHandle((HANDLE)m_hFile);m_hFile = (UINT) hFileNull;m_bCloseOnDelete = FALSE;m_strFileName.Empty();if (bError)CFileException::ThrowOsError((LONG)::GetLastError());
}

大意就是说,这个要关闭的文件句柄不能为空,否则报错。

CGraphicDoc::~CGraphicDoc()
{delete m_UndoList;Fundo.Close ();//这里Fundo不能为空,也就说不能是无效变量remove(FileName);
}

Release对野指针之类的要求是比Dubug要低的,至于为什么WIn7旗舰版也能允许,是因为专业版对程序的要求更严格了。比如看一下下边这个问题

void CMyBitmap::make_palette (int a)
{if(a==0){    GlobalFreePtr(cp);//全局释放cp的句柄,cp类型为LPLOGPALETTE*}GlobalFreePtr(cp);//win7专业版会报错,win7旗舰版不会报错
}

可以看到:当a为0的时候,执行了两遍GlobalFreePtr(cp);如果在Win7旗舰版上,函数是可以正常运行的,但是Win7专业版上就不行,第一次执行GlobalFreePtr(cp)后,cp是已经释放过了,第二次释放的时候,Winodws会认为是野指针了,专业版会报错的,但是旗舰版不知是规避了还是没有处理方正是函数正常退出了。
而解决方法很简单,上述代码只要加上一个else就可以了

void CMyBitmap::make_palette (int a)
{if(a==0){    GlobalFreePtr(cp);//全局释放cp的句柄,cp类型为LPLOGPALETTE*}else   //保证GlobalFreePtr只执行一遍GlobalFreePtr(cp);
}

所以如果大家发现在Win7专业版系统上,经常出现某些程序已停止工作,并不是系统缺东西,而是软件写的不够好(比如说我的有道云笔记经常提示我“您的有道云笔记已停止工作~~~~~~~~”)

补充一个MFC框架的知识点:MFC框架程序的退出主要是doc、view、frame的退出,也就是这三个类调用各自的析构函数,而调用的顺序依次为:~ Frame()、~ View()、~ doc()。如果退出的时候,就依照这个顺序加断点调试就可以了。
最后吐槽一下VC6.0:加断点调试的时候,按F10一步一步的走,如果此时进入的程序对应的.cpp文件没有在工作空间中打开,那么它就会进入汇编的页面,而不是在编辑器中打开相应cpp文件在其中显示,但是从VS2010以上的版本就可以自动打开cpp文件。当VC6.0中出现这样的情况时,可以在调试过程中,在汇编页面加断点,然后停止调试运行后,按ctr+B去找加断点的位置。这也算调试老程序的无奈之举了。

C++:吐槽Win7专业版和Win7旗舰版对C++/程序的影响相关推荐

  1. android+ndk+r9+x64下载,Win7 64位中文旗舰版上Cocos2d-x 3.0的Android开发调试环境架设

    系统环境: Win7 64位中文旗舰版 各组件的版本: VS2012 Python2.7.6 x86 安装步骤: 1.默认安装VS2012 2.默认安装Python 2.7.6,修改环境变量Path ...

  2. 电脑公司GHOST WIN7 SP1 2011装机旗舰版

    电脑公司GHOST WIN7 SP1 2011装机旗舰版 软件大小:3.32 GB推荐星级: 更新时间:2011-06-10 00:03:49软件类别:国产软件 / win7系统下载 授权方式:免费版 ...

  3. win7家庭版怎么升级旗舰版

    着科技的发展,电脑系统也逐渐在升级.如何尽快享受到最新的科技产品,就要对系统进行升级.今天就来讲讲Win7家庭版怎么升级旗舰版. 工具/原料 ​安装Win7家庭版的电脑 方法/步骤 点击[控制面板], ...

  4. Win7系统的家庭版,旗舰版和专业版的区别

    Win7各版标的差别 Windows 7包露6个版本.这6个版本分辨替Windows 7 Starter(低级版).Windows 7 Home Basic(家庭普通版).Windows 7 Home ...

  5. win7 安装openssh_Win732位旗舰版老友纯净版安装OpenSSH的方法

    OpenSSH是SSH协议的免费开源实现,可以用来进行远程控制或者计算机之间传送文件,那么在win7小白纯净版中要怎么安装OpenSSH呢?现在以win7 32位旗舰版系统之家企业版为例,给大家讲解一 ...

  6. mysql win7 sp1 常见问题_win7旗舰版安装不了mysql问题-------win7系统版本选择问题的一点探索...

    win7安装好后在安装mysql server的过程中碰到如下问题: 提示要安装microsoft visual c++ 2019 redistributable x64才能完成安装, 结果到处好不容 ...

  7. win7优化设置_Win7旗舰版系统磁盘碎片整理程序几种打开方法

    方法一:开始搜索框打开法 1.点击Win7旗舰版系统的"开始"按钮,在开始菜单的搜索框中输入"磁盘碎片整理程序",按下键盘上的回车键,如图1所示: 图1 开始搜 ...

  8. win7家庭版升级到旗舰版

    新电脑预装的系统多半是家庭版,介绍一个最简单的装系统的方法: 方案一:下载" 小马一键重装系统 "工具,按照小马工具的操作可以选择在线安装.图文教程地址:http://www.xi ...

  9. win7下运行linux命令,win7系统32位旗舰版iso运行linux shell脚本的操作办法

    win7旗舰版是用户量最大的一款操作系统:有不少人在使用中都遇见了win7系统运行linux shell脚本的问题,对于电脑不太熟悉的朋友面对win7系统运行linux shell脚本便无计可施,其实 ...

最新文章

  1. AI人工智能天机芯芯片
  2. Linux 命令集锦
  3. 02dayC语言数据类型
  4. docker supervisor管理进程
  5. python选择题题库百度文库_大学Python程序题题库
  6. Oracle : ORA-02290: 违反检查约束条件
  7. 开源工具kettle中Job流程的理解
  8. 致传统企业朋友:不够痛就别微服务,有坑 (1)
  9. DataTable类(MSDN)
  10. OSError: [Errno 9] Bad file descriptor
  11. 如何查看opencv版本
  12. uniapp文件体积超过 500KB报错
  13. 想在原有的基础上,再次添加一些阿里图标的进坑
  14. 二十四节气和计算机专业,命理学与二十四节气的关系
  15. error obtaining controller instance: failed to create NAT chain
  16. 图论(十四)——图的着色
  17. HGDB 兼容 Oracle 中 merge into using(APP)
  18. 利用Visual Studio(C++)实现简易计算器(二)
  19. bat 2018自然语言处理校园招聘的要求
  20. perspective

热门文章

  1. 基于RTMP的智慧数字人|AI数字人传输技术方案探讨
  2. Python turtle 绘制一张美女字符画
  3. 用Python爬取微信好友昵称和头像
  4. vue项目中:PC端导出csv或excel数据表方法及其移动端导出表格方法
  5. 全文搜索引擎 Elasticsearch详解
  6. Java常用类————JDK8新增时间类
  7. python如何指定使用的cpu核_Python如何利用多核处理器
  8. pytorch 加载训练好的模型后测试得到的结果不一样
  9. LiveGBS流媒体平台GB/T28181功能-大屏展示智能码流支持码流清晰度切换取低码率直播流
  10. 开一个快手抖音小店,年营业额700多W,我是如何通过副业兼职挣钱的?靠电商实现我的经济自由,分享一下创业经历[内附详细操作文档]