2016-10-05 4 views
1

おはよう、
私はC++で新しいことを試していますが、Visual Studioのデバッグとリリースの設定が私に異なる結果をもたらしたケースが見つかりました。MSVC++不正なコードまたはコルーチンのコンパイルエラー

#include <experimental/generator> 
#include <fstream> 
#include <functional> 
#include <iostream> 
#include <string> 
#include <vector> 


template <typename T = std::string> 
auto getLineByLine(std::string filename, std::function<T(std::string&)> func = [](std::string& var) { return var; }) 
{ 
    std::ifstream infile(filename); 
    std::string line; 

    while (getline(infile, line)) 
    { 
     yield func(line); 
    } 
} 

int main() 
{ 
    std::vector<std::string> myVector; 
    for (const auto& line : getLineByLine("fileWithMoreThanOneLine.txt")) 
    { 
     myVector.push_back(line); 
    } 
    std::cout << myVector[0] << std::endl; 
} 

このコードは、期待通りに出力されます。ファイルfileWithMoreThanOneLine.txtから1行です。
しかし、リリースでは、ベクトルの最初の文字列を印刷しているときに最後の行でクラッシュします。
私はそれをデバッグしようとしたとき、変数myVectorが "最適化されて利用できませんでした"ことがわかりました。リリースで。私はこれが正しい最適化ではないと思う。
for (const auto& line : getLineByLine("fileWithMoreThanOneLine.txt", [&myVector](std::string& var) { return var; }))
それは正しくコンパイル:

はまた、私は、私はこの1つの行を変更した場合ことがわかりました。しかし、変数myVectorはラムダ関数では必要ありません。

私のコードまたはMSVCコンパイラでこの問題はありますか?私はVS 2015 Update 1(コルーチンと最初のVS)とVS "15"をVC++の毎日のビルドで試しました。

は、
ミロスラフHrnčíř

P.S.をありがとう私の悪い英語には申し訳ありません。

+0

「プログラム」とは何ですか? – SomeWittyUsername

+0

また、あなたの現在のコードでは、絶対に 'myVector'に何もプッシュしないでください – Hayt

+0

申し訳ありませんが、プログラムはmyVectorの元の名前です:( – CdTCzech

答えて

1

ファイルパスに問題があるように聞こえますが、おそらくファイルを読み込むことができないため、ベクトルが読み込まれず、ベクトル[0]が範囲外です。

VSはリリースビルドとデバッグビルドを異なるディレクトリに配置します。つまり、デバッグビルドで実行するときに開いているファイルは、使用したのと同じ相対パスでは存在しません。

フルパスでアップデートしてみてください。

+0

これはちょうどポイントです - 彼らは異なる実行ディレクトリを持っており、それは単なるファイル名です。彼らは同じ場所から走っていると仮定することはできません。さらに、MSVCがリリースビルドでファイルを開くことができないライブラリをリリースした場合よりも、OPがこれと似た何かをしている可能性が高くなります。 – UKMonkey

+0

それは本当のことです。おそらく、txtファイルはDebug内にのみあります。いい視点ね。 – AndyG

+0

レスポンスありがとうございますが、デバッグのすべてをファイルから正しく読み込み、リリースモードでは最適化フラグがオンになります。 – CdTCzech

関連する問題