我正在查看源代码并看到这个for
循环:
for (int i=0; i < result1.length(); i++) {
unsigned char *buff = ascii_to_utf8((unsigned char)result1.at(i));
result.append((char*)buff);
free (buff);
}
已更改为:
for (int i=0; i < result1.length(); i++)
result.append((char*)ascii_to_utf8((unsigned char)result1.at(i)));
我能看到的唯一区别是,在第二个代码中没有中间变量。
我的问题是,我看不到的两个代码片段有什么区别吗?在seconde代码中没有free
吗?
------------编辑----------- 这是ascii_to_utf8的源代码:
unsigned char* InvoiceXML::ascii_to_utf8(unsigned char c)
{
unsigned char *out;
if(c < 128)
{
out = (unsigned char *)calloc(2, sizeof(char));
out[0] = c;
out[1] = '\0';
}
else
{
out = (unsigned char *)calloc(3, sizeof(char));
out[0] = (c >> 6) | 0xC0;
out[1] = (c & 0x3F) | 0x80;
out[2] = '\0';
}
return out;
}
答案 0 :(得分:3)
这取决于ascii_to_utf8的作用;它几乎肯定会分配内存,在这种情况下你需要“免费”。所以第二个片段会泄漏内存。
答案 1 :(得分:1)
如果ascii_to_utf8
更改为不分配内存(例如,通过对结果使用静态char数组),则调用方不应删除返回的值。
答案 2 :(得分:1)
如果ascii_to_utf8
确实分配了内存,那么:
第一个片段:如果您的result
对象在append
函数中无法复制,那么它显然是错误的 - 您将存储指针释放价值。
第二段:如果result
对象在append
函数中复制,那就错了;如果不,那么您需要free()
某处的数据,但此代码段是正确的。
此外,如果`ascii_to_utf8
确实通过new
分配内存,则应使用delete
代替。
否则(ascii_to_utf8
不分配内存):
第一个代码段错误 - 你不应free
静态分配内存。
第二个片段是正确的。