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*
skey
和value
的内容将被add
函数复制,并且在返回后不会存储指针以供使用。这意味着调用函数可以在调用add
后立即使用这些指针执行任何操作,例如free
ingkey
和value
调用函数还可以预期add
不会修改键
或值
现在,如果没有注释,并且既没有实现的来源,也没有使用示例,那么有经验的C程序员会对这些所有权问题做出什么样的假设?首先&最重要的是尝试获取文档。除非API记录行为,否则无法100%确定。如果所有尝试均失败,则可以合理假设:
键
也不修改值
,因为它们作为常量
传递李>
键
和值
执行任何操作此外,我们应该通过严格的测试来确认这些假设。就我个人而言,我希望它能够复制这些值。因为如果不这样做,使用局部变量将非常危险
此外,对于地图,如果没有复制,您必须跟踪所有元素及其分配位置,并在释放地图后自己释放它们。downvoter的解释会很有帮助。这位经验丰富的C程序员不会假设任何事情,或者测试行为,或者最好在源代码和/或文档可用的地方找到一个替代方案。“有经验的C程序员会假设什么”——我会得出(不是假设)程序员不称职的结论。(这是我对我所看到的大多数C代码的结论,它缺少这样的注释。)“调用函数也可以预期add不会修改键或值。”--是的,因为它们是按值传递的。如果您是指
*键
和*值
const
强烈地暗示了这一点,但我认为有些程序员非常不称职,他们可能会在add
中存储这些代码。下载者的解释会很有帮助——阅读FAQ也会很有帮助。+1听起来很合理(对于没有经验的C程序员来说)“人们应该通过严格的测试来确认这些假设。“--这只能建立库的当前行为。我想理解测试的局限性需要一些经验以外的东西。@Jim Balter:虽然UB在技术上意味着任何事情都可能发生,但在这种特殊情况下,人们可以最终使用测试来确定行为。我不知道第二句话想说什么,所以我就通过这一句。不像你,我猜不出来。不幸的是,你不知道这意味着什么,因为这是软件工程的一个基本概念。同样,测试只能建立库的当前行为。。。但库的行为随时都可能发生变化。唯一可靠的不会改变的是规范。测试只适用于测试其实现是否符合规范的开发人员;在这里用起来不好。