全局变量被修改后又还原为初始值的诡异有关问题

全局变量被修改后又还原为初始值的诡异问题
比如有一个A.cpp和A.h;cpp中顶一个一个全局bool和获取设置的函数
bool g_Flag = false;
bool getbFlag()
{
    return g_Flag;
}
void setFlag(bool b)
{
    g_Flag = b;
}

A.h中的内容是:

bool getFlag();
void steFlag(bool b);

我在B.cpp中包含了A.h
然后在某个函数中setFlag(true);,随后我就调用getFlag()发现是返回true的;可是我在C.cpp中在调用时发现getFlag()返回了false,可以肯定的是其他再没有修改这个变量的地方,而且C的调用在B的调用之后,这样诡异的问题,可能的原因是什么呢?我也完全编译了一次程序,折腾大半天就是不行。还有如果我初始化为true,那么C中调用时就返回true了。

------解决方案--------------------
这个你都不知道,你都是大神了吧!
1)全局变量,应该定义为易变的,防止编译优化错误。
2)读写全局变量,应该同步

------解决方案--------------------

extern bool g_Flag; 
bool getFlag();
void steFlag(bool b);

------解决方案--------------------
没有人extern了你的g_Flag之后手动改了?我是说不调用你的那个setFlag函数
------解决方案--------------------
去掉编译时的优化选项及定义变量为volatile试试
------解决方案--------------------
逻辑上看不出什么问题。是不是编译器的问题,换个编译器试试?
------解决方案--------------------
弱弱的说,全局搜索g_Flag只有三个结果么,我也没看出啥问题,构造函数里面呢?
全局变量被修改后又还原为初始值的诡异有关问题
------解决方案--------------------
而且C的调用在B的调用之后
这是你从代码看的吧。能不能加上打印输出,证明确实是先调了B才调C
------解决方案--------------------
引用:
Quote: 引用:

这个你都不知道,你都是大神了吧!
1)全局变量,应该定义为易变的,防止编译优化错误。
2)读写全局变量,应该同步
我不是大神啊。怎么个同步读写法?

加锁,使用信号量...
------解决方案--------------------
调试,打断点,内存监视都用上,看看顺序对不对,是不是有其它地方修改,是不是有
溢出覆盖等等,真想只有一个
------解决方案--------------------
会舍变量值改变断点吗?参考下面:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}

------解决方案--------------------
引用:
比如有一个A.cpp和A.h;cpp中顶一个一个全局bool和获取设置的函数
bool g_Flag = false;
bool getbFlag()
{
    return g_Flag;
}
void setFlag(bool b)
{
    g_Flag = b;
}

A.h中的内容是:

bool getFlag();
void steFlag(bool b);

我在B.cpp中包含了A.h
然后在某个函数中setFlag(true);,随后我就调用getFlag()发现是返回true的;可是我在C.cpp中在调用时发现getFlag()返回了false,可以肯定的是其他再没有修改这个变量的地方,而且C的调用在B的调用之后,这样诡异的问题,可能的原因是什么呢?我也完全编译了一次程序,折腾大半天就是不行。还有如果我初始化为true,那么C中调用时就返回true了。


不用加volatile,要加上extern。
不加extern的话,表面上不同的cpp #include 同一个"A.h",实际上bool g_Flag并非全局,只是局部于本cpp单元的变量。

不信 不同的cpp可以输出各自的&g_Flag 确认。
------解决方案--------------------
加个锁全局变量被修改后又还原为初始值的诡异有关问题
------解决方案--------------------
引用:
Quote: 引用:


不用加volatile,要加上extern。
不加extern的话,表面上不同的cpp #include 同一个"A.h",实际上bool g_Flag并非全局,只是局部于本cpp单元的变量。

不信 不同的cpp可以输出各自的&g_Flag 确认。
是给函数加还是变量加,我都加了也没有作用,包括直接使用变量,不调用get函数一样是false


A.h增加一个函数 bool* getFlagAddr()
或者调试getFlag断点看g_Flag的内存地址。
------解决方案--------------------
Interlock系列函数 可以对32Bits数据同步
不然就加锁
Windows 临界区,互斥量,都可以。

------解决方案--------------------
明显是定义了两个变量
------解决方案--------------------
引用: