"
新人发帖,有问题欢迎指正.
有这么个问题,google半天无果.
文字描述是这样的:有一个class,在它的构造函数内部,调用了它自己的一个成员函数,这个成员函数内部,对它的一个成员变量进行赋值.但是发现在release版(-o2)中成员变量并没有被赋值.debug版(-od)是赋值成功的.
环境:VC2005, C++语言.
下面是代码:
// b.h
class B : public A
{
public:
B(uint32 type);
virtual ~B();
void setVersion(uint8 version) { mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); }
void setFlags(uint32 flags) { mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); }
// other member functions here
protected:
uint32 mVersionFlags;
};
// b.cpp
B::B(uint32 type)
: A(type)
{
setVersion(0); // 这里调用了自己的成员函数,对mVersionFlags进行初始化
setFlags(0);
}
// c.h
class C : public B
{
public:
C(): B(TYPE) { printf("vf: %x\n", mVersionFlags); } // 这里将父类B的成员变量打印出来,输出为非零值,而且每次运行的结果都不一样
enum
{
TYPE = FOURCC('c','c','c','c')
};
// other member functions and varibles here
};
问题:如上所示,在class C的构造函数里打印,发现B的成员变量没有被初始化.这个问题仅出现于release版(-o2优化),debug版(-od)不出现.
做过一些尝试,有些办法可以解决,有些不行.
这些办法都可以:
// 办法1:
// b.cpp
B::B(uint32 type)
: A(type)
, mVersionFlags(0) // 办法1: 放在初始化列表里
{
}
// 办法2:
// b.cpp
B::B(uint32 type)
: A(type)
{
setVersion(0);
setFlags(0);
printf("vf1: %x\n", mVersionFlags); // 办法2: 使用一下mVersionFlags. 这样好像编译器就不会优化掉了
}
// 办法3:
// b.cpp
B::B(uint32 type)
: A(type)
{
// 办法3: 直接将之前两个成员函数的函数体替换到这里,也能解决问题
{ mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); }
{ mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); }
}
// 办法4:
// b.h
class B : public A
{
public:
B(uint32 type);
virtual ~B();
void setVersion(uint8 version) { mVersionFlags = ((mVersionFlags&0x00FFFFFF)|(((uint32)version)<<24)); }
void setFlags(uint32 flags) { mVersionFlags = ((mVersionFlags&0xFF000000)|(flags&0x00FFFFFF)); }
// other member functions here
protected:
volatile uint32 mVersionFlags; // 办法4: 增加volatile标记
};
最终我使用了办法4.但是现在的问题是我还是不清楚为什么.哪位大侠能给个提示.
"关注!######
构造函数里面没有对mVersionFlags 初始化。
我现在也遇到了同样的问题,不知老兄你是怎么解决的,万望指教
"版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。