这个free()函数是否清除内存?

时间:2019-11-23 21:08:56

标签: c

我需要您的帮助,因为我不知道我是否真的释放了分配的内存。如果您能为此建议一些工具,我也将不胜感激。谢谢! P.S您可以跳过bb_sort和swap函数。

#include <stdio.h>
#include <stdlib.h>

typedef struct DArray{
    double * array;
    int size;
} DArray;

void getArrays(DArray * arrays, int numOfArrays){
    int curArraySize, i;
    while(numOfArrays >= 0){
        printf("Input size of array: "); scanf("%d", &curArraySize);
        if(arrays[numOfArrays].array = (double*)malloc((arrays[numOfArrays].size = curArraySize)*sizeof(double))){
            for(i = 0; i < arrays[numOfArrays].size; ++i)
            arrays[numOfArrays].array[i] = rand()%100;
            --numOfArrays;
        }
        else{
            printf("Error, have no enough memory in the system!"); break;
        }
    }
}

void swap(double * arr, int pos1, int pos2) {
        int tmp = arr[pos1];
        arr[pos1]=arr[pos2];
        arr[pos2]=tmp;
    } 

double * bb_sort(double * arr, int size){
    int i, j, noChanges = 1;
    while(1){
        for(i = 0;i < size;++i){
            for(j = 0;j < size-1;++j){

                if(arr[j] < arr[j+1]){
                swap(arr, j, j+1);
                noChanges = 0;
                }
            }
            if(noChanges) return arr;
            noChanges = 1;
        }
    }
}

int main() {
    srand (time (NULL));
    int numOfArrays, i, j;

    printf("Input number of arrays: "); scanf("%d", &numOfArrays);

    DArray arrays[numOfArrays];

    getArrays(arrays ,numOfArrays-1);

    for(i = 0; i < numOfArrays; ++i){
        bb_sort(arrays[i].array, arrays[i].size);
    }

    for(i = numOfArrays-1; i >= 0; --i){
        printf("\nSorted array num#%d\n", i+1);
        for(j = 0; j < arrays[i].size; ++j)
            printf(" %.1lf ", arrays[i].array[j]);

        free(arrays[i].array); <------FREE MEMORY?
        printf("\n");
    }
    printf("Done!");
    while(1){
    }
    return 0;
}

================================================ ================================================== ====

2 个答案:

答案 0 :(得分:2)

简短答案: OP询问是否“清除了内存”。从技术上讲,不需要免费实现清理内存(例如,将数据设置为零或某些随机数据)。大多数实现都不会清除内存以节省时间。

如果错误地代码将尝试读取数据,则通常会发现数据仍在内存中,可能由free调用或其他代码(已将释放的内存分配给其他任务)修改了。

对于安全敏感的信息(密码,信用卡号,私钥),通常在对这些数据进行零处理之前,或者用其他模式填充该区域,然后再免费拨打电话。这样会更难/降低因错误,错误或黑客入侵而访问数据的风险。

某些内存调试器将使用模式数据/ guards / etc填充释放的内存,以帮助及早发现内存问题。

答案 1 :(得分:1)

是的,因为根据C99标准(ISO / IEC 9899:1999),您的程序使用 malloc 函数创建了array指针,并且它不操纵该指针: 7.20.3.2自由功能(p:313):

  

免费功能导致 ptr 所指向的空间被释放,即可以进一步分配。如果 ptr 是空指针,则不会发生任何操作。否则,如果参数与 calloc malloc realloc 函数返回的指针不匹配,或者空间已被释放通过调用免费重新分配,行为是不确定的。