我在C
程序开发方面经验很少。正如我在标题中所描述的,如何确定 C 标准库函数中是否需要释放返回字符指针?例如,我是否需要在 string.h 中释放函数的getenv
返回指针stdlib.h
?strstr
我在文档中找不到任何描述。
提前致谢。
我在C
程序开发方面经验很少。正如我在标题中所描述的,如何确定 C 标准库函数中是否需要释放返回字符指针?例如,我是否需要在 string.h 中释放函数的getenv
返回指针stdlib.h
?strstr
我在文档中找不到任何描述。
提前致谢。
每个函数都应在其手册页中注明。
例如getenv()
,关于删除什么也没说,这真的没有必要(或者是错误的)。vasprintf()
,另一方面,明确指出返回的指针必须是free()
'd。
在 gnu/linux 中输入man strstr (或使用您喜欢的网络搜索引擎进行搜索)。
手册页getenv
还指出:
getenv() 函数搜索环境列表以查找环境变量名称,并返回指向相应值字符串的指针。
这里和C 语言中的设计理念通常不是制作任何必要的副本,而是出于性能原因指向已经存在的数据。
一个反例是strdup
,它使用 internal 复制字符串malloc
,并且必须是free()
d。
http://en.cppreference.com/w/cpp/utility/program/getenv
修改 getenv 返回的字符串会调用未定义的行为。
所以你不应该碰那个。
http://en.cppreference.com/w/cpp/string/byte/strstr
返回值:指向 str 中找到的子字符串的第一个字符的指针
这将返回一个指向输入 c 字符串中的字符的指针。所以它是一个指向已经存在的内存的指针,而不是一个新分配的字符串,你不应该free
这样。
ps虽然没有改变答案,但我还是从问题的C++标签的角度出发。对于 C 语言文档,请参见手册页,或者对于本网站,请参见http://en.cppreference.com/w/c/program/getenv和http://en.cppreference.com/w/c/string/byte/ strstr(与上述内容基本相同)
永远回报free()
你malloc()
和家人回报给你的东西。
家庭是calloc()
和realloc()
。
大多数其他标准库函数不会返回新分配的内存,也不需要free()
d。strdup()
(如果提供)是一个例外而不是规则。
函数之类fopen()
的返回一个确实需要交出但不需要交出的fclose()
指针free()
。
但不幸的是,真正的答案是“检查文档并了解你的库”。
C 编码的一个事实是您几乎完全负责资源管理,包括确切地知道要交出哪些资源以及何时交出。
这就是 C. Hurray 的力量和诅咒,由你掌控!嘘!你在掌控之中。
例如,查看The Man of getenv您可以阅读:
笔记
[...] 通常实现,getenv() 返回一个指向环境列表中的字符串的指针。调用者必须注意不要修改这个字符串,因为这会改变进程的环境[...]
强调我的
和
描述
getenv() 函数搜索环境列表以查找环境变量名称,并返回一个指向 > 对应值字符串的指针。
强调我的
换句话说,您不能释放该指针,因为它是指向进程环境中的字符串的指针,而不是为您的工作分配的字符串。
正确设计的库永远不会返回您必须手动操作的指针free()
。如果他们使用动态内存或其他需要清理的资源,他们将有一个用于该目的的函数——如果你愿意,一个析构函数,你必须手动调用它。