关于VC++7.1的编译器优化(处理异常的时候):是特性,BUG,还是我理解有局限?

penter 2003-07-02 03:25:42
陈述很长,可能需要一些耐心;

#include <iostream>
using namespace std;

class some_class
{
public:
some_class() { cout << "some_class constructed." << endl; }
~some_class() { cout << "some_class destructed." << endl; }
};

int _tmain(int argc, _TCHAR * argv[], _TCHAR **envp)
{
int div = 0;

// 如下语句中,object 在离开 try 块时被正确的析构
try
{
some_class object;//注意这里2!!!!!!

cout << "throwing exception" << endl;//注意这里1!!!

int a = 16 / div;

cout << "a = " << a << endl;
}
catch(...)
{
cout << "in catching C++ exception" << endl;
}

return 0;
}
以上这段代码,如果在VC7.1下打开编译器优化为Maximize Speed (/O2)的时候,
执行结果为:
some_class constructed.
throwing exception
some_class destructed.
in catching C++ exception
正常;

如果去掉“注意这里1”那句,release结果就成了:
some_class constructed.
in catching C++ exception
我的析构函数没有给调用;哪怕我在construct中动态分配内存,在deconstruct中删除内存都不会给调用;

如果去掉“注意这里2”那句,结果是release下成了  系统报错,我的异常处理代码没有给执行;

但如果关掉 优化,问题就不会出现;

这个问题这几天总是出现,让我得出很多错误的结论;
我想知道,这是VC7.1的特性,还是BUG,还是我理解有错?

请大家指教,谢谢!!!
...全文
83 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
penter 2003-07-02
  • 打赏
  • 举报
回复
谢谢大家的参与;谢谢楼上大侠!
In355Hz 2003-07-02
  • 打赏
  • 举报
回复
避免的方法其实就是关掉全局优化。以下是资料中的出错代码:

When the code is compiled with /Og, the MyStructComp function may return 0 (zero); the function should return 1. The code path for the "else if" condition may not be taken, even when the condition is true.

struct MyStruct
{
unsigned long m_len;
unsigned char *m_lpData;
};

typedef struct MyStruct *LPMyStruct;

short MyStructComp ( struct MyStruct *Arg1,struct MyStruct *Arg2)
{
unsigned long dwLen;
unsigned char *str1, *str2;
dwLen = Arg1->m_len;
str1 = Arg1->m_lpData;
str2 = Arg2->m_lpData;

while (dwLen--)
if (*str1 < *str2)
return (-1);
else if (*(str1++) > *(str2++))
return (1);
else if (*str1 > *str2)
{
str1++;
str2++;
}

return (0);
}

看了这篇资料以后,我觉得以后为了保证安全,还是每次都关掉这个优化选项比较好。

In355Hz 2003-07-02
  • 打赏
  • 举报
回复
我的 VC6.0 存在同样的问题。查了一下 MSDN ,有一篇相关资料描述了 /Og (/O1 /O2 都包含了这一选项) 全局优化选项带来的错误编译问题:

BUG: Bad Code Generated by Global Optimization
ID: Q236349

文中介绍了如下命令可以避免此问题的发生:

#pragma optimize("g", off)

测试了一下,对 VC6.0 有效,我没有在 VC7.1 上测试

penter 2003-07-02
  • 打赏
  • 举报
回复
我用的是D版;也可能是beta版;不知道各位用什么?
solar 2003-07-02
  • 打赏
  • 举报
回复
vs2003/xp
Maximize Speed (/O2)是release的默认配置
solar 2003-07-02
  • 打赏
  • 举报
回复
我的vc7.1怎么就没有问题呢?
yongdu 2003-07-02
  • 打赏
  • 举报
回复
你的理解是没错的。错在编译器,错在它的优化。。。

把优化关了就应该OK了。
penter 2003-07-02
  • 打赏
  • 举报
回复
以上的结果都是在release 下的;

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧