该代码可以正常工作:

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/

10-17 00:30
查看更多