FILE *,fopen_s和初始化列表

时间:2012-11-13 17:25:19

标签: c++ initialization-list

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

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 *的位置有关,但我无法证实这一点。任何人都可以解释为什么会失败吗?

0 个答案:

没有答案