我应该释放setlocale返回的指针吗?

时间:2015-03-18 07:30:36

标签: c linux macos valgrind setlocale

int main(int argc, char *argv[])
{
    char *ret = setlocale(LC_ALL, NULL);
    // should I free 'ret' ???
    // free(ret);
    return 0;
}

我已经尝试过Linux和OS X 10.10,在Linux上,我不能称之为'免费',但在OS X上,如果我不打电话'免费',valgrind会抱怨内存泄漏。

==62032== Memcheck, a memory error detector
==62032== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==62032== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info
==62032== Command: ./a.out
==62032== 
--62032-- ./a.out:
--62032-- dSYM directory is missing; consider using --dsymutil=yes
==62032== 
==62032== HEAP SUMMARY:
==62032==     in use at exit: 129,789 bytes in 436 blocks
==62032==   total heap usage: 519 allocs, 83 frees, 147,421 bytes allocated
==62032== 
==62032== 231 bytes in 1 blocks are definitely lost in loss record 63 of 91
==62032==    at 0x10000859B: malloc (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==62032==    by 0x1001E68C8: currentlocale (in /usr/lib/system/libsystem_c.dylib)
==62032==    by 0x100000F6B: main (in ./a.out)
==62032== 
==62032== LEAK SUMMARY:
==62032==    definitely lost: 231 bytes in 1 blocks
==62032==    indirectly lost: 0 bytes in 0 blocks
==62032==      possibly lost: 0 bytes in 0 blocks
==62032==    still reachable: 94,869 bytes in 10 blocks
==62032==         suppressed: 34,689 bytes in 425 blocks
==62032== Reachable blocks (those to which a pointer was found) are not shown.
==62032== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==62032== 
==62032== For counts of detected and suppressed errors, rerun with: -v
==62032== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 17)

所以, 在Linux中,如果我称之为“免费”,它就会崩溃。 在OS X中,如果我不调用'free',它会有内存泄漏。

1 个答案:

答案 0 :(得分:9)

你应该 free你得到的字符串。根据C11标准:

  

7.11.1.1 setlocale函数

     

指向字符串返回的字符串   setlocale   函数就是这样一个后续的调用   使用该字符串值及其关联的类别将恢复该程序的那部分   语言环境。 指向的字符串不得被程序修改,但可能是   被随后的电话覆盖覆盖   setlocale   功能

此外,Linux man pages说:

  

此字符串可以分配          静态存储。

如果您尝试free,则会导致程序崩溃。

看起来Linux实现使用静态存储,但OSX使用malloc。无论发生什么事情,你都不应该修改它因为标准不允许你这样做 - 在OSX上安全的事实是你应该忽略的实现怪癖。 Valgrind在这里给你一个误报。