在C

时间:2016-03-02 18:46:32

标签: c pointers struct destructor dynamic-allocation

在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
}

作为不良做法的一个例子,我没有释放记忆。当函数返回其值时,它会破坏局部变量和结构。但我的结构有一个指针,用于保存已分配的内存。在互联网上进行一些研究之后,我不太可能找到适合这些情况的良好破坏方法解决方案。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

简单指针需要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; }

旧学校风味的结果:

values <- matrix(1:120, nrow=10)

答案 2 :(得分:0)

开始时:n.stack=…malloc();

结束时:free(n.stack);

每个 malloc()靠近块的开头,应该在块的附近有一个匹配的 free();