在 C 中破坏结构的最佳方法是什么

What is the best way to destruct the structure in C

在 C++ 中,我们有具有构造函数和析构函数的结构。它使生活变得更加轻松,特别是当它要有指针时,因此在结构中动态分配内存。您甚至可以使用 std::shared_pointer 库来处理指针。

class A{
private:
    int size;
    double* stack;

public:    
   A(int size) : this->size(size){}
   ~A(){free(stack);}
};

但我的数学讲师不喜欢 C++,更喜欢 C 中的所有内容。所以我不得不改用 C,并想出了以下结构:

typedef struct vectorOfDoubles{
    double* stack;
    int size;
} vector;

我编写了计算双精度向量中位数的函数。

double median_(const vector* v) {
    vector n;  // creates vector class object
    n.stack = (double*)malloc(sizeof(double)*(n.size = v->size));  // takes double ptr and allocates the right amount of memory for it
    memcpy(n.stack, v->stack, sizeof(double)*n.size);  // copies the array of doubles.
    sort(&n);  // sorts the array of doubles 
    if(v->size%2)  // checks for odd size
        return n.stack[(v->size/2+1)];  // return median for odd size
    else
        return (n.stack[(v->size/2)]+n.stack[(v->size/2+1)])/2;  // return median for even size
}

作为不良做法的一个例子,我没有释放内存。当函数 returns 其值时,它会破坏局部变量和结构。但是我的结构有一个指针来保存分配的内存。不太可能在互联网上进行一些研究后,我没有找到针对这些情况的任何好的销毁方法解决方案。

我的问题是老派的 C 程序员在想要释放结构中的指针但没有结构的析构函数时如何处理这些情况执行自己来完成某项工作?

开头:n.stack=…malloc();

最后:free(n.stack);

每个 malloc() 接近块的开始,应该有一个匹配的 free(); 接近块的结束。

如果你想在 C 中释放一个使用某种分层存储(即指向其他对象的内部指针)的对象,我通常会编写一个特定于该对象的释放函数。例如:

void free_my_obj(my_obj_t *my_obj)
{
    free(my_obj->a);
    free_my_obj2(my_obj->my_obj2);
    free(my_obj);
}

一个简单的指针需要一个 *alloc() 最后一个 free().

具有动态字段的结构值得精心制作 vector_alloc()vector_free()

老派风格的结果:

// Return non-0 on error
int vector_alloc(vector *ptr, size_t size) {
  assert(ptr);
  ptr->stack = calloc(size, sizeof *(ptr->stack));
  if (ptr->stack) {
    ptr->size = size;
    return 0;
  }
  ptr->size = 0;
  return 1;
}

void vector_free(vector *ptr) {
  assert(ptr);
  free(ptr->stack);
  ptr->stack = NULL;
  ptr->size = 0;
}


double median_(const vector* v) {
    vector n;
    if (vector_alloc(&n, v->size)) return 0.0/0.0;
    memcpy(n, v->stack, sizeof *n->stack *n.size);
    sort(&n);  
    double y;   
    if(v->size%2) 
        y = n.stack[(v->size/2+1)];
    else
        y = (n.stack[(v->size/2)]+n.stack[(v->size/2+1)])/2;
    vector_free(&n);
    return y;
}