释放中间变量

时间:2012-12-06 15:22:11

标签: c++ memory free

我正在查看源代码并看到这个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; 
}

3 个答案:

答案 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静态分配内存。

第二个片段是正确的。