free () 2D-массивы в C с помощью malloc - PullRequest
3 голосов
/ 26 октября 2011

Я хотел бы использовать free () для удаления целых матричных массивов из памяти. Как мне это сделать?

Выделите массивы:

// test.h
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define BYTE unsigned char
#define  my_array(n_height, n_width) (BYTE **)create_array(sizeof(BYTE), (n_height), (n_width))

char  **create_array(int u_size, int height, int width);
char  **create_array(int u_size, int height, int width)
{
    char  **array;
    int     i;

    if (!(array=(char **)malloc(height*sizeof(char *)))) {
        printf("Memory allocation error.\n");
        exit(0);
    }
    if (!(array[0]=(char *)malloc(height*width*u_size))) {
        printf("Memory allocation error.\n");
        exit(0);
    }
    for (i=1; i<height; i++)
        array[i] = array[i-1] + width*u_size;
    return array;
}

// test.c
#include "array.h"
int main()
{
    unsigned char *bytes;
    BYTE  **matrix;
    matrix = my_array(height, width);

    int c = 0;
    for (int h=0; h < height; h++) {
        for (int w=0; w < (width); w++) {
            matrix[h][w] = bytes[c];
            c++;
        }
    }

    printf("Done.\n");

    free(matrix); // really empty memory??
}

Я не уверен, была ли матрица полностью удалена из памяти при использовании free (matrix);

Ответы [ 4 ]

5 голосов
/ 26 октября 2011

Вы должны звонить free() ровно один раз за звонок на malloc().Вы не можете «обмануть» free() в свободе: несколько блоков.Если вы хотите иметь возможность вызывать free() только один раз, вам необходимо выделить всю необходимую память за один вызов malloc().

2 голосов
/ 26 октября 2011

У вас есть два malloc с, поэтому вам нужно два free с. Но вы можете немного оптимизировать, если вы измените распределение:

/...
void* mcontent;
if (!(mcontent = malloc(height*sizeof(char*) + height*width*u_size))) {
    printf("Memory allocation error.\n");
    exit(0);
}
array = (char **)mcontent;
array[0]=(char *)(mcontent + height*sizeof(char*));

Это имеет два преимущества. Во-первых, удобство использования: вам нужно только освободить матричный «объект», не заботясь о том, как он был сделан. Во-вторых, эффективность: у вас есть местность И только одно распределение, что означает скорость.

1 голос
/ 26 октября 2011

Если хотите, вы можете использовать прекрасный массив указателей C99 на переменную длину.

Выделите так:

char (*arr)[width] = emalloc(width*height);

Индекс как этот:

arr[23][10] = 2; //row 23, column 10

И бесплатно, как это:

 free(arr);
0 голосов
/ 26 октября 2011

Если вы хотите проверить, свободна ли память, вы должны использовать программу Valgrind.См. Краткое руководство по эксплуатации Valgrind В этом случае попробуйте это:

free(matrix[0]);
free(matrix);
...