FILE*, fopen_s и списки инициализации

У меня есть класс, объявленный так (показаны только соответствующие части):

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 выделяет ФАЙЛ *, но я не могу это подтвердить. Кто-нибудь может объяснить, почему это не удается?

0 ответов

Другие вопросы по тегам