我什么时候需要免费?

时间:2011-06-28 09:48:11

标签: c memory malloc

假设我有以下结构:

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_newsecond_new分配内存。

我想为free结构编写second_t函数。 我想我必须让用户负责释放他的first_t结构。这是对的吗 ?或者我必须写一些类似的东西:

void second_free(second_t second) {
  free(second->a);
  first_free(second->b);
  free(second);
}

5 个答案:

答案 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)

我更喜欢以下方法:

  

谁做了分配,负责解除分配。