力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks


有些情况下,Debug版的程序运行的正常,可是用Release版就出问题了,网上有很多解决办法。最近,我不幸也遇到了这种情况,不过解决方法却很简单——更改编译选项。


VC6 Release版下的Optimizations选项默认是Maximize Speed。至于vc是如何优化的那是它的事情,我是不知道。但可以观察到优化的结果。为了跟踪release下的出事地点,临时启用Release下的Generate debug info项,进行调试。在函数调用堆栈中,发现少调用了一个函数——一个inline函数,被VC优化掉了?于是,把Optimizations选项设置为Disable。再运行,一切OK。


有一个Singleton类:
class COperatorManager 
{
public:
 void SetOperator(UINT nOpID);
 static COperatorManager& Instance(void)
 {
  static COperatorManager s_Instance;
  return s_Instance;
 }
 // 其余省略
};

出事地点:
COperatorManager::Instance().SetOperator(id); 

release下该句的调用堆栈:
COperatorManager::SetOperator(id);   // 出错。



这样使用Singleton在VC6 Release版本下并不是总会出现问题。而我是恰巧遇上了,又恰巧解决了。故在此记录一下:
Debug版的程序运行的正常,可是用Release版就出问题,此时把Relase版的把Optimizations选项设置为Disable再试一下看问题是否解决。

posted on 2005-12-28 11:08 力为 阅读(6021) 评论(9)  编辑 收藏 引用 所属分类: 4. C++ FAQ

评论

# re: 当VC的Release版与Debug版不一致时 2005-12-28 13:06 小明
我晕,你这就叫解决问题了阿
你把Optimizations都关掉了,Release就没有速度优势了

最简单的方法是COperatorManager的getInstance方法不要inline阿
class COperatorManager
{
public:
void SetOperator(UINT nOpID);
static COperatorManager& Instance(void);
// 其余省略
};

//....cpp
COperatorManager& COperatorManager ::Instance(void);
{
static COperatorManager s_Instance;
return s_Instance;
}

  回复  更多评论
  

# re: 当VC的Release版与Debug版不一致时 2006-01-04 18:12 力为
按照上述该了也不行,看来不是代码的问题。最后我设置成“Default",就OK了。  回复  更多评论
  

# re: 当VC的Release版与Debug版不一致时 2006-03-12 08:25 dingding
看看你的代码,在调用出事以前,COperatorManager是否没有任何实例化。

release版本优化的时候对static变量的处理有时候不那么static  回复  更多评论
  

# re: 当VC的Release版与Debug版不一致时 2006-03-17 08:29 我是阿牛
class COperatorManager
{
private:
static COperatorManager *s_Instance;
public:
void SetOperator(UINT nOpID);
static COperatorManager& Instance(void)
{
if(!s_Instance)
s_Instance = new COperatorManager ;
return s_Instance;
}
// 其余省略
};  回复  更多评论
  

# re: 当VC的Release版与Debug版不一致时 2006-03-17 15:00 力为
嗯,这只是不同版本的singleton实现  回复  更多评论
  

# re: 当VC的Release版与Debug版不一致时 2006-04-26 17:59 no
你这样没有解决根本问题。
之所以出错还是跟你的程序有关系。大部分都是基础不好。很多变量类型/函数使用不对导致的。  回复  更多评论
  

# re: 当VC的Release版与Debug版不一致时 2006-06-17 13:48 Aeolus Zheng
实际做工程时经常会出现Debug版本没问题而Release版本崩溃的问题,纠其原因都是因为代码本身的问题导致的,而不是可以简单的依靠改变VC编译开关就能解决的。  回复  更多评论
  

# re: 当VC的Release版与Debug版不一致时 2006-06-17 21:29 mythma
现在想一下这个问题, Aeolus Zheng说的"不是可以简单的依靠改变VC编译开关就能解决的"很有道理.
但有时候也不能排除编译器优化代码的时候会出错.

相同的代码, 当我在vc2003下编译后便不存在这个问题了.
可以断定是vc6的错!  回复  更多评论
  

# re: 当VC的Release版与Debug版不一致时 2008-07-17 08:40 attica
VC6的C++编译器在很多方面都没有完全满足C++标准
微软是只到VC2003才对C++标准支持得很好,建议VC6能不用就不用了
当然VC6绝对是C++史书上最炫目的一笔,但毕竟已经是历史  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理