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但写入 from strMessage。可能是这些字符串对象的长度不相等,可能导致分配的内存不足。

的使用memcpy()也不正确:

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

因为sizeof(strMESSAGE)不是strMESSAGE. 改为使用length()

调用send()还将尝试访问可能大于分配给它不应该访问的内存的256字符。MESSAGEMESSAGE

我不确定为什么这个电话send()不简单:

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

避免任何动态内存分配或复制。

只是要注意我不熟悉,MarshalString()所以不能评论它的使用。

于 2012-12-18T19:37:01.277 回答