我做了一个测试程序:
#include <iostream>
using namespace std;
class Bug {
private:
char a[25];
int& view (int i) {
return *reinterpret_cast<int*>(&a[i]);}
public:
Bug () {}
void overwrite () {
view(a[0]) = 2;
cout << "value of a[0] is: " << view(a[0]) << endl;
}
};
int main () {
Bug b;
b.overwrite();
return 0;
}
...我正在测试视图功能。一切都按照我的预期运作;从a[0]
开始的值是2,因为void方法中的print语句显示。
但是,我稍微修改了程序:
#include <iostream>
using namespace std;
class Bug {
private:
int x;
char a[25];
int& view (int i) {
return *reinterpret_cast<int*>(&a[i]);}
public:
Bug () {}
void overwrite () {
view(a[0]) = 2;
cout << "value of a[0] is: " << view(a[0]) << endl;
}
};
int main () {
Bug b;
b.overwrite();
return 0;
}
请注意,我添加了一个私有成员变量int x
。这是唯一的变化。我这样做的时候,覆盖方法中的print语句不再打印2,就像在前一个程序中一样 - 它返回一个垃圾值(有时是正确的值,2)。
更重要的是,有时会显示正确的值,但程序会出现段错误。
有人知道引擎盖下发生了什么吗?
奖金问题。对于低于25的值,我的私有变量char a [value]将显示编译器警告,提到堆栈粉碎(使用g ++ - 4.7)。