【问题标题】:Ownership conventions in C [closed]C中的所有权约定[关闭]
【发布时间】:2013-01-01 17:54:33
【问题描述】:

假设我想使用包含这 2 个标头的库:

// types.h
typedef const char* Value;
typedef const char* Key;

// map.h
/** The given name and value will be copied into the map */
void add(struct Map* m, Key key, Value value);

我假设注释意味着char*s keyvalue 的内容将被add 函数复制,并且它不会在返回后存储指针以供使用.这意味着调用函数可以使用这些指针做任何事情,例如freeing keyvalue,在调用 add 之后立即。

调用函数也可以预期add不会修改keyvalue

现在,如果没有该注释并且既没有实现源代码也没有使用示例,那么有经验的 C 程序员会如何看待这些所有权问题?

【问题讨论】:

  • 反对者的解释会有所帮助。
  • 这位经验丰富的 C 程序员不会假设任何事情,并且会测试行为或最好找到源代码和/或文档所在的替代方案可用。
  • “有经验的 C 程序员会假设什么”——我会得出结论(不是假设)程序员不称职。 (这是我对我看到的大多数 C 代码的结论,其中缺少这样的 cmets。)
  • '调用函数也可以预期add不会修改key或value。' -- 嗯,是的,因为它们是按值传递的。如果您的意思是 *key*value ... const 强烈建议这样做,但我想有些程序员如此无能,他们可能会将它们存储在 add 中。
  • '反对者的解释会有所帮助' -- 阅读常见问题解答也会有所帮助。

标签: c ownership


【解决方案1】:

首先是尝试并获取文档。除非 API 记录行为,否则无法 100% 确定。如果所有尝试都失败了,那么可以合理地假设:

  1. 函数不会修改KeyValue,因为它们是作为const 传递的。
  2. 除非明确提及,否则调用者保留传递给函数的变量的所有权,并且可以在函数调用后对传递的KeyValue 做任何他们想做的事情。

此外,应该通过严格的测试来确认假设。

【讨论】:

  • +1 听起来很合理(对于没有经验的 C 程序员来说)
  • “应该通过严格的测试来确认假设。” -- 那只能建立库的当前行为。我想要了解测试的局限性,需要的不仅仅是经验。
  • @Jim Balter:虽然 UB 在技术上意味着任何事情都可能发生,但在这种特殊情况下,最终可以使用测试来确定行为。我不知道第二句话打算说什么,所以我就通过那句话。不像你,我不会猜的。 Hth.
  • 悲剧的是你不知道它是什么意思,因为它是软件工程的基本概念。同样,测试只能确定库的当前行为......但库的行为可以随时更改。唯一可靠不会改变的是规范。测试只适用于测试他/她的实现符合规范的开发人员;在这里不好用。
【解决方案2】:

就个人而言,我希望它能够复制这些值。因为如果不这样做,使用局部变量会非常危险。

此外,如果是地图,您必须跟踪所有元素以及它们的分配方式,如果复制不会发生,您必须在释放地图后自行释放它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多