私はこのように宣言されたクラスを持っています(関連する部分のみを示しています):
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* を割り当てている場所に関係があると思われますが、確認できません。なぜこれが失敗するのか誰でも説明できますか?