Ниже у меня есть функция trim()
. Который удаляет ведущие нули из массива int. Он возвращает указатель, который он получает от malloc()
. При запуске цикла последовательных вызовов trim()
и free()
. Я заметил, что значение, возвращаемое trim()
- которое было получено malloc()
, на каждой итерации одинаково.Странное двойное свободное поведение
Это мое понимание того, что освободив тот же указатель дважды, если это не NULL
, приведет к двойной свободной ошибки. Почему в этой ситуации не встречается ошибка double?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, length;
int n[] = { 4, 5, 6 };
int m[] = { 0, 3, 5 };
int *num;
int *trimmed, *trimmed_length;
trimmed_length = &length;
for (i = 0; i < 10; i++)
{
num = (i % 2 == 0) ? n : m;
trimmed = trim(num, 3, trimmed_length);
if (!trimmed)
{
printf("trimmed was null\n");
exit(-1);
}
for (j = 0; j < *trimmed_length; j++)
{
printf("%d", trimmed[j]);
}
printf("\n");
free(trimmed);
}
exit(0);
}
int *trim(int *n, int nlength, int *res_length)
{
int i, j;
int *res;
for (i = 0; i < nlength; i++)
{
if (n[i] > 0)
{
break;
}
}
*res_length = (nlength - i);
res = malloc(sizeof(int) * (*res_length));
if (!res)
{
return NULL;
}
j = 0;
while (i < nlength)
{
res[j++] = n[i++];
}
printf("Returned pointer from trim() %d\n", res);
return res;
}
Выход:
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Двойные бесплатные не приводят к ошибкам; они приводят к неопределенному поведению, когда что-то может случиться. –
Предоставлено. Теперь у меня вопрос: почему 'trim()' возвращает одно и то же значение при одинаковых вызовах? Например, если мне нужно обрезать список чисел, чтобы предотвратить утечку памяти, мне нужно было бы «освободить» результат 'trim()' перед последующими вызовами. В этом случае, хотя последующие вызовы, похоже, возвращают одно и то же значение, из 'malloc()'. Должно ли 'malloc()' не возвращать новое значение для каждого последующего вызова 'trim()'? – cryptic
Вы выделяете, вы бесплатно. В вашем коде нет ошибки - по крайней мере, не тот, на который вы ссылаетесь. И почему бы вам не использовать одно и то же ведро снова, как только вы его опустошили? Одноразовая память? – Olaf