开发者社区> 问答> 正文

c++构造函数内调用自己的成员函数,对自己的成员变量赋值,却无效 403.10 禁止访问:配置无效 

新人发帖,有问题欢迎指正.

有这么个问题,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)不出现.

展开
收起
kun坤 2020-05-28 13:23:01 882 0
1 条回答
写回答
取消 提交回答
  • 做过一些尝试,有些办法可以解决,有些不行. 这些办法都可以:
    // 办法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 初始化。

    ######在debug下mVersionFlags的初始值是0,但在release下却不是这样######FOURCC是干什么的?我把FOURCC那个TYPE改成=0之后,用-O2和-g都是可以正确出结果的。。(为了防止初始值是0,我在B的构造函数里面还把 setVersion(0); setFlags(0);的参数改成了1,也没问题。。)

    compiled by g++ (GCC) 4.8.1 20130725 (prerelease)######我现在也遇到了同样的问题,不知老兄你是怎么解决的,万望指教

    2020-05-28 16:11:07
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载