0

Windows 7 64 SP1、ブースト 1.42、MS VS 2010 アルティメット、C++

この簡素化されたコードは、次のスイッチを使用して、「Visual Studio x64 コマンド プロンプト (2010)」内で正常にコンパイルおよび実行されます。

cl /EHsc /W4 /nologo

#include <string>

using namespace std;        // I know not to use.

int main() {

  string sentence = "abc";
  string word_found = "";
  string::const_iterator it = sentence.begin();

  while ( *it != ' ' && it != sentence.end() )  
    word_found += *it++;                        
}

ただし、VS IDE 内でコンパイルした後、実行すると、次のエラーでクラッシュします。

Expression: string iterator not dereferencable

問題はどうやら*itin にあり( *it != ' ' && it != sentence.end() )ます。式を短絡する必要があるだけなので、右側の式 the *it != ' ', は評価されません。

while ( it != sentence.end() && *it != ' '  )

それからそれはうまくいきます。

しかし、コマンド プロンプトから元のコードをコンパイルした後、問題なく実行されるのはなぜでしょうか? このサブセットの派生元であるはるかに大きなプログラムには、他に異常な動作はありません。string::iterator が同じ問題を引き起こさないのは何ですか?

FWIW、これらはデフォルトの MS VS コマンド ライン オプションです。/ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Debug\test short.pch" /Fa"Debug\" /Fo"Debug\" /Fd"Debug\vc100.pdb" /Gd /analyze- /errorReport:queue

コマンドライン コンパイラと IDE コンパイラが異なる実行可能ファイルを生成するのはなぜですか? VS IDE からコンパイルする場合と同じように実行可能ファイルを動作させるコマンド プロンプト コンパイラに追加できるスイッチはありますか?

4

1 に答える 1

3

これらのランタイムチェックは、デバッグビルドでデフォルトでのみ有効になっています。あなたはどちらかをする必要があります

于 2012-10-02T17:26:20.053 に答える