调试断言失败

时间:2012-12-18 19:28:05

标签: c++ winforms

我一直收到调试断言失败错误,我无法弄清楚原因。运行此代码时出现错误:

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

有时直到我多次使用该代码后才会出现错误,有时我会在第一次使用它时得到错误。我真的不知道为什么我得到这个,我无法弄清楚如何解决它。所以,如果有人可以提供帮助,我会很感激。

我在该代码中遇到的错误是: enter image description here

1 个答案:

答案 0 :(得分: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)不是strMESSAGE中的字符数。请改用length()

send()的调用也将尝试访问来自256的{​​{1}}个字符,这些字符可能大于为MESSAGE分配的字符,因此不应访问内存。< / p>

我不确定为什么电话MESSAGE不是简单的:

send()

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

请注意我不熟悉if (send(sConnect,strMESSAGE.c_str(),strMESSAGE.length(), NULL) != SOCKET_ERROR){ ,因此无法对其使用发表评论。