簡體   English   中英

這個 free() 函數會清理內存嗎?

[英]Does this free() function clean the memory?

我需要你的幫助,因為我不知道我是否真的釋放了分配的內存。 如果您能為此目的建議我一些工具,我也將不勝感激。 謝謝! PS 您可以跳過 bb_sort 和交換功能。

#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;
}

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

簡短回答:OP 詢問“內存是否已清理”。 從技術上講,免費實現不需要清理內存(例如,將數據設置為零,或一些隨機數據)。 大多數實現不會清除內存以節省時間。

如果代碼錯誤地嘗試讀取數據,它通常會發現數據仍在內存中,可能被 free 調用或其他代碼修改,這些代碼將釋放的內存分配給其他任務。

對於安全敏感信息(密碼、信用卡號、私鑰),通常在撥打免費之前將數據歸零,或用其他模式填充該區域。 這將使它更難/降低數據被錯誤、錯誤或黑客訪問的風險。

一些內存調試器會用模式數據/保護/等填充釋放的內存,以幫助盡早檢測內存問題。

是的,它會,因為您的程序使用malloc函數創建了array指針,並且它不操作該指針,根據 C99 標准(ISO/IEC 9899:1999):7.20.3.2 自由函數(p:313):

free函數導致ptr指向的空間被釋放,即可供進一步分配。 如果ptr是空指針,則不會發生任何操作。 否則,如果參數與之前由callocmallocrealloc函數返回的指針不匹配,或者如果空間已通過調用freerealloc釋放,則行為未定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM