在C编程中,通常会创建数据结构,初始化后在不再需要时释放。例如,如果我们想要创建一个动态double数组,通常会声明:
这个问题涉及到自由函数常见的模式。在 C 语言中,函数
这个还是那个?
这个问题被问到是因为我们开始在法国的预科学校教授C语言给本科生,而我们对“C设计模式”没有太多经验。
感谢您的建议。
struct vector {
double *data;
int size;
int capacity;
}
typedef struct vector vector;
vector *v_new(int n) {
vector *v = malloc(sizeof(vector));
v->data = malloc(n * sizeof(double));
v->size = n;
v->capacity = n;
return v;
}
这个问题涉及到自由函数常见的模式。在 C 语言中,函数
free
接受 NULL 指针并且不执行任何操作。设计 v_free
函数时,这种方式是否是一个常见的模式,还是通常期望非空指针?为了清楚起见,你是否希望采用以下实现方式:void v_free(vector *v) {
if (v != NULL) {
free(v->data);
}
free(v);
}
这个还是那个?
void v_free(vector *v) {
free(v->data);
free(v);
}
这个问题被问到是因为我们开始在法国的预科学校教授C语言给本科生,而我们对“C设计模式”没有太多经验。
感谢您的建议。
vector
是否被分配,都调用v_free
,那么第一种情况将是更好的方法。它将避免在空指针上访问成员变量,这是未定义行为。 - TruthSeekerNULL
并不完全可靠。如果你free
了一个指针,它就不会被设置为NULL
,这样就容易遭受双重free
的风险,这是UB。如果你未能初始化一个指针,它可能没有被初始化为NULL,所以你仍然容易free
一个无效的指针。总之,程序员始终应该做正确的事情。话虽如此,我对第一种方法也没有意见。 - yano