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',它会有内存泄漏。
答案 0 :(得分:9)
你应该不 free
你得到的字符串。根据C11标准:
7.11.1.1
setlocale
函数指向字符串返回的字符串
setlocale
函数就是这样一个后续的调用 使用该字符串值及其关联的类别将恢复该程序的那部分 语言环境。 指向的字符串不得被程序修改,但可能是 被随后的电话覆盖覆盖setlocale
功能
此外,Linux man pages说:
此字符串可以分配 静态存储。
如果您尝试free
,则会导致程序崩溃。
看起来Linux实现使用静态存储,但OSX使用malloc
。无论发生什么事情,你都不应该修改它因为标准不允许你这样做 - 在OSX上安全的事实是你应该忽略的实现怪癖。 Valgrind在这里给你一个误报。