Когда я должен освободиться? - PullRequest
3 голосов
/ 28 июня 2011

Допустим, у меня есть следующие структуры:

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);
}

Ответы [ 5 ]

2 голосов
/ 28 июня 2011

Это зависит.Какова семантика вашего кода?

Если семантика second->b = first заключается в том, что вы передаете владение , то second_free действительно должно вызывать first_free.(Хотя в этом случае может быть целесообразно иметь функцию second_create_first для сохранения инкапсуляции.)

Если вы не передаете право собственности, то вызов first_free должен быть обязан клиентскому коду.

Какую бы семантику вы ни выбрали, вы должны четко указать в своей документации.

0 голосов
/ 28 июня 2011

Я предпочитаю подход:

Кто бы ни сделал распределение, ответственен за освобождение.

0 голосов
/ 28 июня 2011

Пойдите, к которому вы когда-либо подходите, вы чувствуете себя более гибким.

Если вы считаете, что пользователь выделил память, и пользователь должен освободить ее, то пусть он делает это по-своему.

Если вы считаете, что хотите облегчить жизнь пользователя, напишите подходящую бесплатную функцию и позвольте ему вызывать ее, если он считает, что должен ее вызвать.

Здесь вопрос также представляется расплывчатым, поскольку до тех пор, пока не будет представлено все требование, на этот вопрос невозможно ответить.

0 голосов
/ 28 июня 2011

Это зависит от того, выделит ли ваша second_new память для его члена b или нет. Распределение / освобождение должно быть симметричным.

0 голосов
/ 28 июня 2011

Поскольку пользователь выделил first, пользователь должен освободить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...