我想使用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)时,我不确定矩阵是否已完全从内存中删除;
答案 0 :(得分:5)
每次致电free()
时,您必须拨打malloc()
一次。你不能“愚弄”free()
免费:几个街区。如果您希望只能呼叫free()
一次,则需要确保通过一次调用malloc()
分配所有必需的内存。
答案 1 :(得分:2)
你有两个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*));
这有两个好处。首先,可用性:你只需要释放你的矩阵“对象”,而不必费心如何制作它。第二,效率:你有地点和只有一个分配,这两者都意味着速度。
答案 2 :(得分:1)
如果您愿意,可以使用漂亮的C99指针到可变长度数组。
像这样分配:
char (*arr)[width] = emalloc(width*height);
像这样的指数:
arr[23][10] = 2; //row 23, column 10
像这样免费:
free(arr);
答案 3 :(得分:0)
如果要检查内存是否已释放,则应使用Valgrind
程序
见The Valgrind Quick Start Guide
在这种情况下,试试这个:
free(matrix[0]);
free(matrix);