-1

我在C程序开发方面经验很少。正如我在标题中所描述的,如何确定 C 标准库函数中是否需要释放返回字符指针?例如,我是否需要在 string.h 中释放函数的getenv返回指针stdlib.hstrstr我在文档中找不到任何描述。

提前致谢。

4

6 回答 6

7

每个函数都应在其手册页中注明。

例如getenv(),关于删除什么也没说,这真的没有必要(或者是错误的)。vasprintf(),另一方面,明确指出返回的指针必须是free()'d。

于 2017-05-03T06:03:17.000 回答
4

在 gnu/linux 中输入man strstr (或使用您喜欢的网络搜索引擎进行搜索)。

手册页getenv还指出:

getenv() 函数搜索环境列表以查找环境变量名称,并返回指向相应值字符串的指针。

这里和C 语言中的设计理念通常不是制作任何必要的副本,而是出于性能原因指向已经存在的数据。

一个反例是strdup,它使用 internal 复制字符串malloc,并且必须是free()d。

于 2017-05-03T06:01:56.673 回答
3

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/getenvhttp://en.cppreference.com/w/c/string/byte/ strstr(与上述内容基本相同)

于 2017-05-03T06:05:19.733 回答
2

永远回报free()malloc()和家人回报给你的东西。

家庭是calloc()realloc()

大多数其他标准库函数不会返回新分配的内存,也不需要free()d。strdup()(如果提供)是一个例外而不是规则。

函数之类fopen()的返回一个确实需要交出但不需要交出的fclose()指针free()

但不幸的是,真正的答案是“检查文档并了解你的库”。

C 编码的一个事实是您几乎完全负责资源管理,包括确切地知道要交出哪些资源以及何时交出。

这就是 C. Hurray 的力量和诅咒,由你掌控!嘘!你在掌控之中。

于 2017-05-03T06:17:19.893 回答
1

例如,查看The Man of getenv您可以阅读:

笔记

[...] 通常实现,getenv() 返回一个指向环境列表中的字符串的指针。调用者必须注意不要修改这个字符串,因为这会改变进程的环境[...]

强调我的

描述

getenv() 函数搜索环境列表以查找环境变量名称,并返回一个指向 > 对应值字符串的指针

强调我的

换句话说,您不能释放该指针,因为它是指向进程环境中的字符串的指针,而不是为您的工作分配的字符串。

于 2017-05-03T06:05:46.893 回答
1

正确设计的库永远不会返回您必须手动操作的指针free()。如果他们使用动态内存或其他需要清理的资源,他们将有一个用于该目的的函数——如果你愿意,一个析构函数,你必须手动调用它。

于 2017-05-03T06:58:09.497 回答