0

デバッグアサーション失敗エラーが発生し続けますが、その理由がわかりません。このコードを実行するとエラーが発生します:

     private: System::Void txtMessage_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^  e) {
         if(e->KeyCode == Keys::Enter && txtMessage->Text != ""){

             char* MESSAGE = new char[txtMessage->Text->Length];
             ZeroMemory(MESSAGE, sizeof(MESSAGE));

             string strMESSAGE = "";

             MarshalString(txtMessage->Text, strMESSAGE);
             memcpy(MESSAGE, strMESSAGE.c_str(), sizeof(strMESSAGE));

             if (send(sConnect, MESSAGE, 256, NULL) != SOCKET_ERROR){
                 txtMessage->Clear();
             }
         }
     }

そのコードを複数回使用するまでエラーが発生しない場合もあれば、初めて使用したときにエラーが発生する場合もあります。なぜこれを取得しているのか本当にわかりません。また、修正方法がわかりません。だから誰かが助けてくれるなら私はそれをいただければ幸いです。

そのコード中に私が繰り返し発生するエラーは次のとおりです。 ここに画像の説明を入力してください

4

1 に答える 1

1

これは正しくありません:

char* MESSAGE = new char[txtMessage->Text->Length];
ZeroMemory(MESSAGE, sizeof(MESSAGE));

sizeof(char*)意図したのではなく、バイトのみをゼロ化するためLengthです。

への割り当てMESSAGEも に基づいてtxtMessageいますが、 から に書き込まれstrMessageます。これらの文字列オブジェクトの長さが等しくない場合、メモリの割り当てが不十分になる可能性があります。

の使用memcpy()も正しくありません。

memcpy(MESSAGE, strMESSAGE.c_str(), sizeof(strMESSAGE));

sizeof(strMESSAGE)文字数ではありませんstrMESSAGElength()代わりに使用してください。

への呼び出しは、結果としてメモリにアクセスしてはならないために割り当てられたものよりも大きい可能性のある文字send()にアクセスしようとします。256MESSAGEMESSAGE

呼び出しsend()が単純ではない理由がわかりません:

if (send(sConnect,strMESSAGE.c_str(),strMESSAGE.length(), NULL) != SOCKET_ERROR){

動的メモリ割り当てまたはコピーを回避します。

私は慣れてMarshalString()いないので、その使用についてコメントすることはできません。

于 2012-12-18T19:37:01.277 に答える