我应该释放 setlocale 返回的指针吗?
Should I free the pointer returned by 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 上我不能调用 'free',但在 OS X 上,如果我不调用 'free',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 中,如果我调用 'free',它将崩溃。
在 OS X 中,如果我不调用 'free',它就会发生内存泄漏。
您应该而不是 free
您得到的字符串。根据C11标准:
7.11.1.1 The setlocale
function
The pointer to string returned by the
setlocale
function is such that a subsequent call
with that string value and its associated category will restore that part of the program’s
locale. The string pointed to shall not be modified by the program, but may be
overwritten by a subsequent call to the
setlocale
function
此外,Linux man pages 说:
This string may be allocated in
static storage.
如果您尝试 free
它会导致您的程序崩溃。
看起来 Linux 实现使用静态存储,但 OSX 使用 malloc
。无论引擎盖下发生了什么,您 都不应该修改它 因为标准不允许您这样做 --- 它在 OSX 上是安全的事实是你应该忽略的实现怪癖。 Valgrind 本质上是给你一个误报。
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 上我不能调用 'free',但在 OS X 上,如果我不调用 'free',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 中,如果我调用 'free',它将崩溃。 在 OS X 中,如果我不调用 'free',它就会发生内存泄漏。
您应该而不是 free
您得到的字符串。根据C11标准:
7.11.1.1 The
setlocale
functionThe pointer to string returned by the
setlocale
function is such that a subsequent call with that string value and its associated category will restore that part of the program’s locale. The string pointed to shall not be modified by the program, but may be overwritten by a subsequent call to thesetlocale
function
此外,Linux man pages 说:
This string may be allocated in static storage.
如果您尝试 free
它会导致您的程序崩溃。
看起来 Linux 实现使用静态存储,但 OSX 使用 malloc
。无论引擎盖下发生了什么,您 都不应该修改它 因为标准不允许您这样做 --- 它在 OSX 上是安全的事实是你应该忽略的实现怪癖。 Valgrind 本质上是给你一个误报。