Присвоить ноль адресу указателя
Как я могу деинициализировать x внутри функции free_x? Я должен сделать это, чтобы соответствовать методу API. Я могу очень легко деинициализировать x, просто присвоив ему значение null, но я должен сделать это внутри функции free_x.
typedef struct
{
int field1;
void *field2;
}my_struct;
static my_struct var;
int main(void)
{
void *x;
alloc_x(&x);
free_x(x); // x = NULL works but not allowed
return 0;
}
void alloc_x(void **param)
{
*param = (my_struct *)&var;
}
void free_x(void *param)
{
// how can I free param here?
}
4 ответа
Простой ответ: ваш код уже завершен, так что не делайте больше.
Объяснение: Вы не выделяете память (в куче, в стеке или где-либо еще), поэтому освобождать нечего. Вы не вступаете во владение никакими ресурсами, которые должны быть возвращены, не устанавливаете какие-либо флаги, которые должны быть очищены, или увеличиваете любые семафоры, которые должны быть уменьшены, и т. Д.
Вы реализуете API, но только потому, что существует прототип функции, который не означает, что ваша реализация должна что-то делать, если в этом нет необходимости. Просто измените комментарий, чтобы объяснить, что делать нечего, и оставьте функцию пустой.
void alloc_x(void **param)
{
*param = &var; // No need to cast here, just assign.
}
void free_x(void *param)
{
// Nothing allocated, taken, incremented, etc. in alloc_x, so ...
// nothing to free, release, decrement, etc. here in free_x.
}
Код, который использует API, ожидает память за param
или же x
указатель, который должен быть освобожден после вызова, так что он не должен ничего делать со своей переменной после этого в любом случае. Это не твоя проблема, если они это сделают, но это будет твоя проблема, если ты обойдёшься с абонентом x
переменная!
Просто пиши *param = NULL;
malloc возвращает void *, а free принимает void *, поэтому некоторые ваши приведения бессмысленны, и вы всегда освобождаете void *, даже если начинаете с какого-либо другого указателя.
Я не думаю, что это возможно без изменения функции alloc_x. Одна из возможных реализаций приведена ниже:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int field1;
void *field2;
}my_struct;
static my_struct var;
void alloc_x(void **param)
{
*param = malloc(sizeof(my_struct *));
memcpy(*param,(my_struct *)&var,sizeof(my_struct *));
}
void free_x(void *param)
{
free(param);
// how can I free param here?
}
int main(void)
{
void *x;
alloc_x(&x);
free_x(x); // x = NULL works but not allowed
return 0;
}
Немного странно, но вы можете сделать
#include <stdio.h>
#include <string.h>
typedef struct
{
int field1;
void *field2;
}my_struct;
static my_struct var;
void alloc_x(void **param)
{
*param = (my_struct *)&var;
}
void free_x(void *param)
{
memset(param, 0x00, sizeof(void *));
}
int main(void)
{
void *x;
alloc_x(&x);
printf("Before: x=%p\n", x);
free_x(&x);
printf("After: x=%p\n", x);
return 0;
}
или же
void free_x(void *param)
{
my_struct **p = param;
*p = NULL;
}
Очевидно, это действительно только в случае использования void *