Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的所有权约定_C_Ownership - Fatal编程技术网

C中的所有权约定

C中的所有权约定,c,ownership,C,Ownership,假设我想使用包含以下两个标题的库: // 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*skey和value的内容将被add函数复制,并且在返回后不会存储指针以供使

假设我想使用包含以下两个标题的库:

// 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
key
value
的内容将被
add
函数复制,并且在返回后不会存储指针以供使用。这意味着调用函数可以在调用
add
后立即使用这些指针执行任何操作,例如
free
ing
key
value

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


现在,如果没有注释,并且既没有实现的来源,也没有使用示例,那么有经验的C程序员会对这些所有权问题做出什么样的假设?

首先&最重要的是尝试获取文档。除非API记录行为,否则无法100%确定。如果所有尝试均失败,则可以合理假设:

  • 函数既不修改
    也不修改
    ,因为它们作为
    常量
    传递
  • 除非明确提及,否则调用方保留传递给函数的变量的所有权,并可以在函数调用后使用传递的
    执行任何操作

  • 此外,我们应该通过严格的测试来确认这些假设。

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


    此外,对于地图,如果没有复制,您必须跟踪所有元素及其分配位置,并在释放地图后自己释放它们。

    downvoter的解释会很有帮助。这位经验丰富的C程序员不会假设任何事情,或者测试行为,或者最好在源代码和/或文档可用的地方找到一个替代方案。“有经验的C程序员会假设什么”——我会得出(不是假设)程序员不称职的结论。(这是我对我所看到的大多数C代码的结论,它缺少这样的注释。)“调用函数也可以预期add不会修改键或值。”--是的,因为它们是按值传递的。如果您是指
    *键
    *值
    const
    强烈地暗示了这一点,但我认为有些程序员非常不称职,他们可能会在
    add
    中存储这些代码。下载者的解释会很有帮助——阅读FAQ也会很有帮助。+1听起来很合理(对于没有经验的C程序员来说)“人们应该通过严格的测试来确认这些假设。“--这只能建立库的当前行为。我想理解测试的局限性需要一些经验以外的东西。@Jim Balter:虽然UB在技术上意味着任何事情都可能发生,但在这种特殊情况下,人们可以最终使用测试来确定行为。我不知道第二句话想说什么,所以我就通过这一句。不像你,我猜不出来。不幸的是,你不知道这意味着什么,因为这是软件工程的一个基本概念。同样,测试只能建立库的当前行为。。。但库的行为随时都可能发生变化。唯一可靠的不会改变的是规范。测试只适用于测试其实现是否符合规范的开发人员;在这里用起来不好。