如何在free_x函数中取消初始化x?我必须这样做才能适应API方法。我可以很容易地通过为它分配null来取消初始化x,但我必须在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?
}
答案 0 :(得分:2)
简单回答:您的代码已经完成,所以不要再做了。
说明:您没有分配内存(在堆或堆栈或其他地方),因此没有任何内容可以释放。您不会获取必须返回的任何资源的所有权,设置需要清除的任何标志,或者增加任何需要递减的信号量等。
您正在实现一个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
变量一起讨论,那将是你的问题!
答案 1 :(得分:0)
只需撰写*param = NULL;
malloc返回void *并且free取无效*,因此你的一些强制转换是 毫无意义,即使你是,你也总是在释放空虚* 从另一种指针开始。
答案 2 :(得分:0)
在不更改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;
}
答案 3 :(得分: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 *