我有一个像这样声明的类(只显示相关部分):
class X
{
public:
X(int x);
private:
FILE *stream;
int _x;
}
构造函数打开一个文件:
X::X(int x) : _x(x)
{
int err = fopen_s(&stream, "myfile.txt", "w");
fputs("some text", stream);
...
}
它在另一个类中使用:
class Y
{
public:
Y();
private:
X myX;
}
在Y的构造函数中,通过初始化列表初始化myX,并在其上调用一个方法:
Y::Y() : myX(100)
{
myX.init();
}
当我单步执行X的构造函数时,将分配并写入流而不会出错。如果我在Y的构造函数的左括号中放置一个断点,则stream与X的构造函数中的值相同。但是,当我进入Y的构造函数体时,流的值会发生变化并且下次使用它(例如在init()中)导致访问冲突。如果我更改Y以存储指向X而不是直接引用的指针并在堆上分配X,则一切正常。我怀疑它与fopen_s分配FILE *的位置有关,但我无法证实这一点。任何人都可以解释为什么会失败吗?