2017-02-22 4 views
0

後にアプリケーションがメモリにworteことを検出し、ここで正確なスクリーンショットだ:ヒープ破損:通常のブロックの後に... CRTは、私はこのコードを実行すると、私はタイトルにエラーが発生します、ヒープバッファの終わり

enter image description here

私のコードはこれです:

string ProcessCommand(vector<unsigned char> data) 
{ 
    try 
    { 
     int valread = data.size(); 
     unsigned char* converted = &data[0]; 
     char *buffer = (char *)converted; 
     buffer[valread] = '\0'; 
     const char file[] = ">myfile.txt"; 
     char * newBuffer = new char[strlen(buffer) + strlen(file) + 1]; 
     strcpy(newBuffer, buffer); 
     strcat(newBuffer, file); 
     system(newBuffer); 
     fstream f("myfile.txt", fstream::in); 
     string str; 
     getline(f, str, '\0'); 
     //const char * sendfile = str.c_str(); 
     //char * result; 
     //result = const_cast<char *>(sendfile); 
     f.close(); 
     remove("myfile.txt"); 
     return str; 
    } 
    catch (const std::exception&) 
    { 

    } 
} 
+0

コードをフォーマットする方法を学んでください。 –

+0

'buffer [valread] = '\ 0';は1つだけオフになります。 – tkausl

+4

ようこそStackOverflowへ。私はあなたのためにあなたの質問をフォーマットしました。次回は、投稿時にプレビューオプションを利用できるので、これを自分で行うようにしてください。あなたの質問に答えたい人を尊重し、読んでもらうための完全な混乱を投稿しないでください。 – StoryTeller

答えて

3

buffer[valread] = '\0';は存在しませんbufferの要素にアクセスしようとしています。プログラムの動作は定義されていません。

data.at(valread)を代わりに使用していた場合、std::exceptionはC++ 11標準の要求に従ってスローされ(catchサイトで代行受信されていました)。

また、すべての連結に対してオーバーロードのstd::stringを使用することを検討してください。あなたがすれば、あなたのコードはもっと読みやすくなります。 newBuffer(自動保存期間も含む)にはstd::stringタイプを使用してください。常にc_str()を使用して、読み取り専用で内部データバッファにアクセスすることができます。

+2

ニックピッチではありませんが、これは2017ですが、C++ 14の採用を推奨してはいけませんか?それは現在の標準であるためです。 – StoryTeller

+2

私はちょうど私のtoolchainをC++ 11に移動しました;-)しかし、あなたはここでポイントを持っているかもしれません。 – Bathsheba

+0

もっと詳しく... –

関連する問題