0

Windows 7 64 SP1,Boost 1.42,MS VS 2010 Ultimate,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() )。我只需要将表达式短路,因此现在右手表达式 ,*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 回答