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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]