在运行时执行到达语句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;
}
答案 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)
发生了崩溃。