2009-04-20 20 views
0

私は、VS 2005 C++プロジェクトにデバッグビルドとリリースビルドの両方を用意しています。私は次の4つのことを試みました:Visual Studio 2005 C++ランタイムの新規例外

  1. Visual Studioで実行可能なデバッグをビルドし、Visual Studioで実行します。
  2. cdvstudio/debugに書き込んだ後に、コマンドライン(Cygwin)経由で外部にビルドされた実行可能ファイル(1)を実行します。
  3. Visual Studioで実行可能なリリースをビルドし、Visual Studioで実行します。
  4. vstudio/releaseにあるcdの後に、コマンドライン(Cygwin)経由で外部(3)に組み込まれた実行可能ファイルを実行します。

最初の3つがすべて成功しました。プログラムは完了して実行されます。

しかし、4番目の実行時にクラッシュします。デバッグでは、原因はmalloc()のオペレータnew()の呼び出しであることが示されています。誰もが私が説明する3アウト・オブ・4症状につながるあらゆる問題を考えることができる場合

template<typename T> class Foo { 
    ... 
    static void bar() { 
     ... 
     T* ptr = new T(); 
     ... 
    } 
    ... 
} 

、それははるかに高く評価されるだろう:関連するコンテキストは次のようになります。

+0

エラーは何ですか? –

答えて

1

おそらく破損しているヒープがあります。これは、割り当てられたメモリの外部にポインタを書き込むことによって発生します。

これがデバッグモードで発生しない理由は、ヒープ上のデバッグ情報(リリースモードでは存在しない)だけを上書きすることが原因である可能性があります。

環境はよく分かりませんが、おそらくBoundsCheckerのようなツールを使ってバグを見つけてください。

+0

おそらくそうです。デバッガの下でプログラムが実行されるとき、OSは別のヒープを使用します。 AppVerifierで確認してください。 – MSalters

+0

ヒープ破損の仮説はおそらくそうです。 しかし、私はこれらのツールのいくつかを調べる前に、(3)ではなく(4)ではうまくいかないという仮説がありますか? –

+0

for(3) - あなたがVSから 'run'と言うときは、起動またはデバッグを意味しますか? – laktak

0

私の最初の推測では、cygwinには、あなたのプログラムが使用するために作られたいくつかのWindows DLLの代替DLLがあると思います。

これをテストするには、Windowsコマンドシェル(cmd.exe)で実行し、同じエラーが発生するかどうかを確認するのが良い方法です。

+0

Windowsのコマンドシェルで実行しようとしました。奇妙なことに、私はcygwinで起動したときとまったく同じ場所にいませんでしたが、同じエラーが発生しました。 'Foo :: bar()'と同じテンプレート化された呼び出しでしたが、異なる 'T'がありました。 –

+0

その場合、私はクリスと一緒だと思う。 –

関連する問題