该代码可以正常工作:
void sendToOne(int fd, string message)
{
message += "$";
char* S = new char[message.length()];
strcpy(S, message.c_str());
write(fd, S, message.length());
}
但是,当我添加零钱时:
void sendToOne(int fd, string message)
{
string msg2 = message + "$";
char* S = new char[msg2.length()];
strcpy(S, msg2.c_str());
write(fd, S, msg2.length());
}
我得到:
free(): invalid pointer
错误。您能解释一下为什么会这样吗? 最佳答案
您的代码中有一个缓冲区溢出写:
char* S = new char[msg2.length()];
strcpy(S, msg2.c_str());
第一行为
msg2
中的字符分配了足够的空间,但是第二行复制了所述字符(假设没有嵌入的NUL
)和结尾处的NUL
字节(总共比分配的字节多一个字节)。如果您不走运,并且分配结束时没有松弛字节,则通常会覆盖后续分配(或空闲列表中的条目)之前的分配器元数据字节;当分配器尝试使用它们时,它(如果您很幸运)试图读取无效的内存并立即死亡;如果您“不幸”,它恰好指向您的进程可用的随机内存,但可能不是正确的位置,并且您会逐渐变得越来越腐败,直到一切爆发。综上所述,这样做是很愚蠢的。只需直接写入
string
的数据:string msg2 = message + "$";
write(fd, msg2.c_str(), msg2.length());
这也避免了在没有智能指针管理或对
new
的匹配调用的情况下使用delete[]
造成的内存泄漏。关于c++ - free():添加字符串时的无效指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48088119/