再次分配内存...
我似乎不明白为什么我对free的调用对对象中的数组不起作用。这对我来说很有意义,但是我遇到了细分错误。我只想在minStackFree函数中释放min_array和堆栈中的数组。有谁知道为什么会这样?
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int * array;
int array_idx; // is 'top'
int * min_array;
int min_idx;
} MinStack;
MinStack * minStackCreate() {
MinStack * obj = malloc(sizeof(MinStack*));
//initialize the stacks
obj->array = malloc(10000*sizeof(int*));
obj->min_array = malloc(10000*sizeof(int*));
//initialize the index
obj->array_idx = -1;
obj->min_idx = -1;
}
void minStackFree(MinStack* obj) {
free(obj->min_array); // ************PROBLEM
free(obj->array); // ************PROBLEM
free(obj); // OK
}
它不是的问题,如果 malloc()
将失败返回NULL
,它的问题时。您必须始终验证每个分配。否则,如果您无法捕获分配失败,则可能会面临未定义行为(可能还有SegFault)的风险。一个简单的检查就是所需要的,例如
#define ARRSZ 10000 /* if you need a constant, #define one (or more) */
MinStack *minStackCreate (void) {
MinStack *obj = malloc (sizeof *obj); /* use dereference pointer for typesize */
if (!obj) { /* validate EVERY allocation */
perror ("malloc-obj");
return NULL;
}
obj->array = malloc (ARRSZ * sizeof *obj->array); /* dereference pointer for typesize */
if (!obj->array) { /* validate EVERY allocation */
perror ("malloc-obj->array");
free (obj); /* free prior allocaitons */
return NULL;
}
obj->min_array = malloc (ARRSZ * sizeof *obj->min_array); /* ditto */
if (!obj->min_array) { /* ditto */
perror ("malloc-obj->min_array");
free (obj->array); /* free prior allocaitons */
free (obj);
return NULL;
}
//initialize the index
obj->array_idx = -1;
obj->min_idx = -1;
return obj; /* return allocated pointer */
}
正如@ chux-ReinstateMonica指出的那样,函数中有多个分配,如果分配失败,则必须在失败之前释放函数中分配的内存,然后再返回NULL
以避免内存泄漏。一旦NULL
返回,您将无法达到故障点之前发生的分配。
请勿在代码中使用幻数(例如10000
)。如果您需要一个常数,#define
一个常数或enum
为同一目的使用全局变量。这样,如果您的需求发生变化,则只有一个位置可以更新,并且在整个代码中都可以看到变化。
可读性。该'*'
引用操作符去与变量没有类型。为什么?可读性:
int* a, b, c;
肯定不申报个三分int
,写作
int *a, b, c;
非常清楚地表明声明了一个指向的指针int
和两个整数。
使用取消引用的指针设置类型大小。如果这样做,您将永远不会弄错类型大小,例如
MinStack *obj = malloc (sizeof *obj);
和
obj->array = malloc (ARRSZ * sizeof *obj->array);
obj->min_array = malloc (ARRSZ * sizeof *obj->min_array);
尽管前面带有声明的简单结构可能很容易设置sizeof(type)
,但是当您使用复杂类型在代码中向下排列1000行时,事情就不会那么容易了,而且很容易猜错。
进行了这些更改,然后obj
在成功或NULL
失败之后返回,minStackCreate()
其余部分在没有警告的情况下进行了编译。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句