У меня есть класс, объявленный так (показаны только соответствующие части):
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 выделяет ФАЙЛ *, но я не могу это подтвердить. Кто-нибудь может объяснить, почему это не удается?
Задача ещё не решена.
Других решений пока нет …