Windows在c中触发了断点?

时间:2014-09-18 13:17:00

标签: c++ c

在运行时执行到达语句free(dat)

时,会出现一个对话框
  

Windows在project.exe中触发了断点。这可能是由于   堆的损坏,表示project.exe或任何错误   它已加载的DLL。

while(1)
{
    char *dat;

    std::cout<<"Enter command\n";
    memset(command, 0, 30);
    std::cin>>command;
    m_size = strlen(command)+2;
    printf("send data Size: %d\n",m_size);
    command[m_size-2] = '\r';
    dat = (char*)malloc(m_size);
    if(!dat)
    {
        printf("mem allocation failed");
    }
    else
    {
        memcpy(dat,command,sizeof(command));
        ok = send_data(dat);
    }
    if(ok>0)
    {
    printf("send data: %s\n",dat);

    }
    free(dat);
}

// Orignal代码看起来像这样

int main()
{
    char command[30];
    While(1)
    {....}
    return 0;
}

2 个答案:

答案 0 :(得分:4)

<强>解决方法1 memcpy(dat,command,sizeof(command));替换为memcpy(dat,command,m_size);

(不要覆盖分配的缓冲区)

<强>溶液2 或者使用dat =(char *)malloc(sizeof(command));

(如果你想写更多的话,分配更大的缓冲区)

<强> Solution3 command[m_size-2] = '\r';之后,添加另一行

command[m_size-1] = '\0'; /* Make it NUL terminated */

memcpy(dat,command,sizeof(command));替换为strcpy(dat, command)

(使用strcpy而不是memcpy)

<强> Solution4

while(1)
{
    std::string command;
    std::cout<<"Enter command\n";
    std::cin>>command;
    command += '\r';
    ok = send_data(command.c_str());
    if(ok>0)
    {
        printf("send data: %s\n",dat.c_str());
    }
}

编写C ++样式代码(std::string,因为您的编译器是C ++)

答案 1 :(得分:4)

您为dat分配的内存量为m_size

dat = (char*)malloc(m_size);

您通过dat修改的内存量为sizeof(command)

memcpy(dat,command,sizeof(command));

为什么?

根据其余代码判断,sizeof(command)通常大于m_size,这意味着通过memcpy覆盖内存并破坏堆的完整性。因此free(dat)发生了崩溃。