假设我有以下结构:
typedef struct first {
int a;
int b;
char *c;
} *first_t;
typedef struct second {
char *a;
first_t b;
} *second_t;
用户执行以下操作:
first_t first = first_new();
second_t second = second_new();
second->b = first;
first_new
和second_new
分配内存。
我想为free
结构编写second_t
函数。
我想我必须让用户负责释放他的first_t
结构。这是对的吗 ?或者我必须写一些类似的东西:
void second_free(second_t second) {
free(second->a);
first_free(second->b);
free(second);
}
答案 0 :(得分:2)
这取决于。您的代码的语义是什么?
如果second->b = first
的语义是转让所有权,则second_free
应该确实调用first_free
。 (虽然在这种情况下,有一个second_create_first
函数可能是合适的,以保持封装。)
如果您没有转让所有权,那么调用first_free
应该是客户代码的责任。
无论你选择什么语义,你都应该在文档中做得非常清楚。
答案 1 :(得分:0)
由于用户已分配first
,因此用户应将其释放。
答案 2 :(得分:0)
这取决于您的second_new
函数是否为其成员b
分配内存。分配/解除分配应该是对称的。
答案 3 :(得分:0)
为你感到更加灵活的事情。
如果您认为用户已经分配了内存并且用户必须自由,那么让他以自己的方式进行。
如果你认为你想让用户的生活更轻松,那就写一个合适的免费功能,如果他认为他应该打电话,就让他打电话。
这个问题似乎也很模糊,因为直到整个要求都提出了无法回答的问题。
答案 4 :(得分:0)
我更喜欢以下方法:
谁做了分配,负责解除分配。