c - 这是在 C 中释放内存的正确方法吗?

标签 c

我在 C 中有一个结构如下:

typedef struct ArrayStruct{
float * array;
size_t used;
size_t size;
}Array;

我初始化如下:

void initArray(Array *a, size_t initialSize) {
    a->array = (float *)malloc(initialSize * sizeof(float));

    if(a->array){
    }
    else{
        printf("OUT OF MEMORY 1!!\n\r");
    }

    a->used = 0;
    a->size = initialSize;
}

我的问题是:以下代码是否是释放结构使用的任何内存的正确方法:

void freeArray(Array *a) {
   a->array = NULL;    
   free(a->array);
   a->used = 0;
   a->size = 0;
}

请帮忙。谢谢。 :)

最佳答案

不,这不是执行 free 的正确方法,因为您在实际释放之前将要释放的指针设置为 NULL 它。你应该反过来做:

free(a->array);  // Free the memory
a->array = NULL; // Clear out a dangling pointer

具有空条件分支的模式也值得怀疑。而不是做

if(a->array){
}
else{
    printf("OUT OF MEMORY !!!\n\r");
}

你应该做的

if(!a->array){
    printf("OUT OF MEMORY !!!\n\r");
}

当分配失败时,您还应该将 a->size 设置为零(目前,即使在分配失败时,您的代码也会遇到将 size 设置为 initialSize 的情况):

if(!a->array){
    printf("OUT OF MEMORY !!!\n\r");
    a->used = 0;
    a->size = 0;
    return;
}

关于c - 这是在 C 中释放内存的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36607751/

相关文章:

c++ - N 个区间的 bool 规则 (C)

C 警告 : implicit declaration of function 'flock' only applies to one of two flock() calls

c - 使用 __VA_ARGS__ 定义字符串化宏时出错

c++ - 用于读取音频文件的库

c - 通过套接字发送图像

c - 在结构中包含版本号字段是否明智?

c - 如何在 SDL 2 中使用调色板

c - 使文件可执行

c++ - 在 C/C++ 中将 1 位 bmp 文件转换为数组

C 在函数中将 int 转换为 double