在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程序员如何处理这些情况,但是他们没有结构的析构函数来执行自己来执行某项工作?
最佳答案 一个简单的指针需要一个* 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;
}