随笔 - 51, 文章 - 1, 评论 - 41, 引用 - 0
数据加载中……

内联单件模式的获取实例函数在VC6 Max-Speed选项下的错误

情景:

单件模式下实例的获取函数Get()的实现写在头文件中,在其它文件中使用获取函数Get()。
xxx.h
class A {
  A& Get() {
  static A s_A;
  return s_A;
  }
};


yyy.cpp
A::Get().FuncB();


zzz.cpp
A::Get().FuncA();


上述代码的期望逻辑是:A的实例只有一个,首次使用会调用A::A(),程序结束时调用A::~A()。

 

问题:
在一个项目中,一段类似的代码在VC6 release Max-Speed下编译,其运行时多次调用A::A(),this指针相同,程序退出时,A::~A()调用超过1次,并在2次出现访问异常。而在VS2008、VC6 Debug或者VC6 Release的非Max-Speed优化选项下编译的程序则运行正常。
此外如果将A::Get()的实现写在xxx.cpp中,则使用VC6 release Max-Speed编译的程序运行正常。

个人猜测:

是否是VC6在执行Max-Speed选项时内联不当引起的问题。尝试使用VC6建立简单工程,实现上述逻辑时,但并未发现A::A()调用多次的情况。

posted on 2015-03-08 20:10 lemene 阅读(175) 评论(0)  编辑 收藏 引用


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