2017-12-06 7 views
0

私は、テキストファイルを読み込み、ファイル内の少数の行のベクトルを正常に返します。私はラインを処理する関数にこのベクトルを渡され、それはとても明らかに簡単な関数呼び出しで未処理の例外

Unhandled exception at 0x00267EF9 in Bridge.exe: 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x00A82000). occurred 

をエラーを投げたベンフォークトが指摘したように、おそらく明らかにすなわち、それを投げた機能とは何の関係もなかったスタックオーバーフローがありました

int LinesToCards(std::vector<std::string>& lines) { 
     int retval = -999; 
     return retval; 
    } 

これは、サードパーティのDLLが必要とするライン

int main() 
     { 
      std::string cards[MAXDEALS][DDS_HANDS][DDS_SUITS] ; 
      int retval = -999;   
      retval = LinesToCards(lines);  
      return 0; 
    } 

の#define DDS_HANDS 4を持っていたメインから呼ばれましたの#define DDS_SUITS 4 を変更することはできませんが、元の作業

#define MAXDEALS 999 

は今、例外がスローされます。私がそれを減らすと、

#define MAXDEALS 890 

に戻ります。私がそれまでに

#define MAXDEALS 891 

それはクラッシュします。 16240と16256の間にいくつかのマジックナンバーがありますか?

+0

呼び出し元があなたのスケルトン関数を呼び出していない場合は、呼び出し元関数ReadFileStableは万一ですか?無限再帰はスタックオーバーフローを説明するでしょう –

+0

申し訳ありませんが、mainは両方を呼び出します。 ReadFileStableは、LinesToCardsによる処理のための入力行を取得するだけです。 – DLyons

+0

あなたは、あなたが私たちに全体のプログラムを表示しない場合、あなたのプログラムの微妙な問題が何であるかを教えてくれません。 –

答えて

1

スタックスペースが不足しています。

障害が発生する機能は、責任を負う機能ではないため、小さなテストプログラムでは発生しません。

失敗したコードへの呼び出しパスの関数の1つが非常に貪欲で、呼び出す関数に十分なスタックを用意していませんでした。

スタック上の大きなオブジェクトと深すぎる再帰の両方を探します。

+0

はい、そうだと思います。私はうまく動作していたものをリファクタリングしていますが、非常に飢えたサードパーティのDLLを呼び出し、以前の呼び出しを混乱させてしまいました。 – DLyons

+0

他のどこかで、私は別のサードパーティプログラムで処理するためのファイルを生成しています。そのコードセクションでは何も変更されておらず、生成されたファイルは完全にOKです。しかし、不可解なことに、今はブランクのヘッダー行と空白のトレーラー行でのみ実行されます。手動でそれらを手動で追加すると、スタックのオーバーフローの問題が解消されます。助けてくれてありがとう。 – DLyons

関連する問題