我有几个作为结构实现的配置标志。我创建一个对象。我用标志调用对象的方法,最终触发两个标志之间的比较。但是,此时,其中一个标志已被某种方式覆盖。
为了澄清,这是一个非常简化的代码版本,应该说明我所看到的:
class flag_type { unsigned int flag; /*more stuff*/ };
flag_type FLAG1
flag_type FLAG2
class MyObject {
public:
void method1(const flag_type& flag_arg) {
//conditionals, and then:
const flag_type flag_args[2] = {flag_arg,flag_arg};
method2(flag_args);
}
void method2(const flag_type flag_args[2]) {
//conditionals, and then:
method3(flag_args[0]);
}
void method3(const flag_type& flag_arg) { //Actually in a superclass
//stuff
if (flag_arg==FLAG1) { /*stuff*/ }
//stuff
}
};
int main(int argc, const char* argv[]) {
//In some functions called by main:
MyObject* obj = new MyObject();
//Later in some other functions:
obj->method1(FLAG1);
}
使用调试器和打印语句,我可以确认 FLAG1 和 flag_arg/flag_args 在“method1”和“method2”中都很好。但是,当我到达方法 3 时,“FLAG1.flag”已损坏,因此比较失败。
现在,虽然我通常不这样做,而且它通过了 MSVC 在最严格设置下的静态代码分析,但对我来说,这看起来像是缓冲区溢出的行为。
我通过查看没有发现任何此类错误,但当然通常不会。我的问题是
A:我在其他地方搞砸了吗?我意识到我没有分享任何真正的代码,但我已经错过了什么吗?这个方案在我重写大部分代码之前就已经奏效了。
B:有没有比更仔细地挑选代码直到找到它更简单的方法?该代码是跨平台的,所以我已经将其设置为在 Ubuntu 机器上使用 Valgrind 进行检查。