1

我有一个这样声明的类(仅显示相关部分):

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* 的位置有关,但我无法确认这一点。谁能解释为什么这会失败?

4

0 回答 0