1

私はこのように宣言されたクラスを持っています(関連する部分のみを示しています):

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* を割り当てている場所に関係があると思われますが、確認できません。なぜこれが失敗するのか誰でも説明できますか?

4

0 に答える 0