我一直收到调试断言失败的错误,但我不知道为什么。运行此代码时出现错误:

     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();
             }
         }
     }


有时直到我多次使用该代码后才会出现该错误,有时我是第一次使用它。我真的不知道为什么得到这个,而且我不知道如何解决它。因此,如果有人可以提供帮助,我将不胜感激。

我在该代码期间不断遇到的错误是:

最佳答案

这是不正确的:

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)不是strMESSAGE中的字符数。请改用length()

调用send()还将尝试从256访问MESSAGE字符,这些字符可能大于为MESSAGE分配的字符,从而导致不应访问的内存。

我不确定为什么send()调用不简单:

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


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

请注意,我不熟悉MarshalString(),因此无法评论其用法。

关于c++ - 调试断言失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13940086/

10-09 02:26