我怎么知道什么时候应该释放库函数返回的 C 中的字符串?
How do I know when I ought to free strings in C returned by library functions?
我应该使用 free()
¹ 在 C 中自行释放哪些字符串?
我的知识状态:
char a[256];
: 没有
char *a = "abcdefg";
: 没有
char *a = malloc(15L);
: 是
getenv()
返回的字符串:no
- Windows 函数返回的字符串²:???
¹ 或 LocalFree()
/GlobalFree()
/VirtualFree()
² 特别是 GetCommandLineW()
对于任何 API 您使用该 returns 字符串(或其他大于单个简单值的数据,例如整数),文档中总是会提到这一点。
是的,这意味着您必须通读所有此类 API 函数的文档,以便跟踪而不是泄漏内存。
唯一必须 free
d 的内存块是之前 malloc
ed 的内存块。
现在的问题是"is this pointer a pointer to memory that was created by malloc
?",如果是,"am I supposed to free it myself or will some other function take care of it ?"
这些问题没有简单的答案,通常文档会告诉您,但经验法则是负责内存创建的模块也负责释放内存。因此,如果您使用的库希望您提供已经分配的内存,您也应该在需要时释放它。
在显式动态分配的情况下,即 malloc/alloc/realloc
你必须显式 free
它。但是既然您已经提到了字符串,那么有一个特殊的函数 strdup()
,当您调用它时,它会在后台 malloc
为您服务。
在 strdup()
的情况下,您必须确保在不分配的情况下必须 free
它。
我应该使用 free()
¹ 在 C 中自行释放哪些字符串?
我的知识状态:
char a[256];
: 没有char *a = "abcdefg";
: 没有char *a = malloc(15L);
: 是getenv()
返回的字符串:no- Windows 函数返回的字符串²:???
¹ 或 LocalFree()
/GlobalFree()
/VirtualFree()
² 特别是 GetCommandLineW()
对于任何 API 您使用该 returns 字符串(或其他大于单个简单值的数据,例如整数),文档中总是会提到这一点。
是的,这意味着您必须通读所有此类 API 函数的文档,以便跟踪而不是泄漏内存。
唯一必须 free
d 的内存块是之前 malloc
ed 的内存块。
现在的问题是"is this pointer a pointer to memory that was created by malloc
?",如果是,"am I supposed to free it myself or will some other function take care of it ?"
这些问题没有简单的答案,通常文档会告诉您,但经验法则是负责内存创建的模块也负责释放内存。因此,如果您使用的库希望您提供已经分配的内存,您也应该在需要时释放它。
在显式动态分配的情况下,即 malloc/alloc/realloc
你必须显式 free
它。但是既然您已经提到了字符串,那么有一个特殊的函数 strdup()
,当您调用它时,它会在后台 malloc
为您服务。
在 strdup()
的情况下,您必须确保在不分配的情况下必须 free
它。