我有一个这样声明的类(仅显示相关部分):
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 的构造函数的左大括号处放置一个断点,则流的值与 X 的构造函数期间相同。但是,当我进入 Y 的构造函数的主体时,流的值会发生变化,并且下次使用它(例如在 init() 中)导致访问冲突。如果我将 Y 更改为存储指向 X 的指针而不是直接引用并在堆上分配 X,则一切正常。我怀疑它与 fopen_s 分配 FILE* 的位置有关,但我无法确认这一点。谁能解释为什么这会失败?