free():添加字符串时指针无效

时间:2018-01-04 03:07:32

标签: c++

此代码可以正常使用:

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错误。你能解释一下为什么会这样吗?

2 个答案:

答案 0 :(得分:5)

您的代码中有一个缓冲区溢出写入:

char* S = new char[msg2.length()];
strcpy(S, msg2.c_str());

第一行为msg2中的字符分配足够的空间,但第二行复制所述字符(假设没有嵌入的NUL s) {{1}最后的字节(比你分配的总共多一个字节)。如果你运气不好,并且在分配结束时没有松弛的字节,你经常会覆盖后续分配之前的分配器元数据字节(或空闲列表中的条目);当分配器尝试使用它们时,它(如果你'幸运")试图读取无效的内存并立即死亡;如果您“不幸”,它恰好指向您的流程可用的随机内存,但可能不是正确的地方,并且您逐渐变得越来越腐败,直到所有内容爆炸

所有这一切,做到这一点真是太愚蠢了。只需直接写下NUL的数据:

string

还可以避免使用string msg2 = message + "$"; write(fd, msg2.c_str(), msg2.length()); 而没有智能指针管理或匹配调用new而造成的内存泄漏。

答案 1 :(得分:3)

你需要额外的1个字节来保存空字符
char* S = new char[msg2.length() + 1];

请参阅strcpy