不明白为什么我不能释放数组

神经丛创造者

再次分配内存...

我似乎不明白为什么我对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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数不能使用类型推断,但是我不明白为什么

来自分类Dev

我不明白为什么Haskell不能推论出这种类型

来自分类Dev

我不明白为什么我的波形是这样出来的

来自分类Dev

不明白为什么斯威夫特要我露骨

来自分类Dev

不明白为什么我的NSString数据为空

来自分类Dev

我不明白为什么Redirect()无法正常工作

来自分类Dev

不明白为什么我的|| 不管用

来自分类Dev

我不明白为什么这个循环死机了

来自分类Dev

不归还烧瓶,但我不明白为什么

来自分类Dev

我不明白为什么for循环不起作用

来自分类Dev

我不明白为什么要打印哈希

来自分类Dev

我不明白为什么会收到此错误

来自分类Dev

关于pytorch,我不明白为什么是输出

来自分类Dev

我不明白为什么它无法连接

来自分类Dev

这个Xaml无效...我不明白为什么

来自分类Dev

我不明白为什么charindex无法正常工作

来自分类Dev

我不明白为什么会收到以下错误

来自分类Dev

不明白为什么我的NSString数据为空

来自分类Dev

我不明白为什么for循环变为无限?

来自分类Dev

我不明白为什么会给出这个输出?

来自分类Dev

不明白为什么我会收到NullPointerException

来自分类Dev

phpExcel TextValueBinder不明白为什么我需要它

来自分类Dev

我不明白为什么这行不通

来自分类Dev

不明白为什么我的|| 不管用

来自分类Dev

StackOverFlow异常我不明白为什么?

来自分类Dev

我只是不明白为什么这行不通

来自分类Dev

我不明白为什么它说 ArrayOutOfBound 错误

来自分类Dev

我不明白为什么状态是未定义的?

来自分类Dev

我不明白为什么这行不通