C释放动态分配的内存

时间:2013-11-10 21:37:17

标签: c memory-management malloc free

我已经定义了函数,它返回多维数组。

行的分配

arr = (char **)malloc(size);

列的分配(循环中)

arr[i] = (char *)malloc(v);

并且返回类型是char **

一切正常,除了释放记忆。如果我在函数返回的数组上调用free(arr [i])和/或free(arr),它就会崩溃。

编辑:

分配功能

pole = malloc(zaznamov);  
char ulica[52], t[52], datum[10];  
float dan;  
int i = 0, v;
*max = 0;
while (!is_eof(f))
{
    get_record(t, ulica, &dan, datum, f);
    v = strlen(ulica);
pole[i] = malloc(v);
strcpy(pole[i], ulica);
pole[i][v-1] = '\0';
if (v - 1 > *max)
{
    *max = v;
}
i++;
}
return pole;

我调用函数的主要部分

pole = function();

释放记忆

int i;
for (i = 0; i < zaznamov; i++)  
{  
    free(pole[i]);  
    pole[i] = NULL;  
}  
free(pole);  
pole = NULL;

2 个答案:

答案 0 :(得分:0)

很少有东西,你不应该施放malloc的结果。

char** alloc_2d_char(int rows, int cols) {
  char *data = malloc(rows*cols*sizeof(char));
  char **array= malloc(rows*sizeof(char*));
  for (int i=0; i<rows; i++)
   array[i] = &(data[cols*i]);
 return array;
}

当然,您需要检查从malloc

返回的NULL

免费:

void free_2d_pixel(char **data){
  free(data[0]);
  free(data);
}

答案 1 :(得分:0)

由于您没有显示完整的分配代码,因此很难知道您做错了什么。鉴于我们所看到的,你应该有类似的东西:

size_t n = 27;
size_t size = n * sizeof(char *);
char **arr = (char **)malloc(size);
size_t v = 39;

if (arr == 0)
    ...report error and bail out...

for (size_t i = 0; i < n; i++)
{
    if ((arr[i] = (char *)malloc(v)) == 0)
    {
        // Out of memory — release what was already acquired
        for (size_t j = 0; j < i; j++)
             free(arr[i]);
        free(arr);
    }
}

然后释放数据:

for (size_t i = 0; i < n; i++)
    free(arr[i]);
free(arr);

您必须以某种方式跟踪数组中元素的数量(我的代码中为n)。弄错了就是问题。其他顺序的释放也是如此;在元素出错之前释放arr

至于铸造或不铸造,malloc()的返回值,就我而言,取决于你。 C ++要求它。 C曾经在标准C之前的日子里要求它。只要你总是使用选项进行编译就必须在调用它之前声明malloc(),它就没有坏处。 C99要求严格的一致性模式。让你的编译器要求它。我几乎总是使用严格的编译器选项来确保发生这种情况:

gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror ...

如果你对此很草率,请不要施放malloc()。如果你小心的话,如果它适合你,你可以施放。