O que acontece quando você tenta libertar () já libertou memória no c?
-
02-07-2019 - |
Pergunta
Por exemplo:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
Existem quaisquer efeitos secundários adversos de se fazer isso?
Solução
Aqui está o capítulo e versículo.
Se o argumento [para a função
free
] não corresponde a um ponteiro anteriormente retornado pelocalloc
,malloc
, ou funçãorealloc
, ou se o espaço foi desalocada por uma chamada parafree
ourealloc
, o comportamento é indefinido. ( ISO 9899: 1999 - Linguagens de programação - C , Seção 7.20.3.2)
Outras dicas
Um dos nada, corrupção de memória em silêncio, ou falha de segmentação.
Sim, você pode obter um livre de erros dupla que faz com que o programa deixe de funcionar. Tem a ver com estruturas de dados internas do malloc para manter o controle de memória alocada.
resumo Resposta:
Sim, as coisas ruins podem e provavelmente vai acontecer.
Para evitar que isso faça:
free(myString);
myString = NULL;
Note-se que todas as referências à memória deve ser definido para NULL
se os outros foram criados.
Além disso, chamando free()
com NULL
resulta em nenhuma ação. Para mais informações consulte: homem livre
Não é tão inteligente. Google para vulnerabilidades gratuitos duplas. Defina o seu ponteiro para NULL
depois de libertar para evitar tais erros.
Dependendo de qual sistema você executá-lo, nada vai acontecer, o programa irá falhar, a memória será corrompido, ou qualquer outro número de efeitos interessantes.
Sempre definir um ponteiro para NULL depois de libertá-la. É seguro tentar liberar um ponteiro nulo.
Vale a pena escrever o seu próprio invólucro livre para fazer isso automaticamente.
It (potencialmente) faz demônios voam fora de seu nariz .
Não faça isso. Se a memória que foi libertado é outra coisa entre as chamadas para free
alocado-re, então as coisas vão ficar confuso.
Bad Things (TM)
Realmente, eu acho que é indefinido de modo absolutamente nada de jogo, inclusive "Guerra Termonuclear Global" com mainframe da NORAD
Pode travar o seu programa, corromper a memória, ou ter outros efeitos negativos mais sutis. Depois de memória de exclusão, é uma boa idéia para configurá-lo para NULL (0). Tentando libertar um ponteiro nulo não faz nada, e é garantido para ser seguro. O mesmo vale para exclusão em C ++.
Em resumo:. "Comportamento indefinido"
(Agora, o que pode incluir e por que esse é o caso, os outros já disseram. Eu só se fosse pena mencionar o termo aqui como é bastante comum).
A macro reconhecidamente estranha abaixo é um drop-in útil substituto para aniquilar algumas classes de vulnerabilidades de segurança, bem como a depuração ajuda desde acessos ao free () 'regiões d são mais propensos a segfault em vez de silenciosamente corromper memória.
#define my_free(x) do { free(x); x = NULL; } while (0)
A fazer-while é ajudar código circundante mais facilmente digerir as múltiplas declarações. por exemplo. if (feito) my_free (x);
Outra situação interessante:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
char * yourString = myString;
if (myString)
{
free(myString);
myString = NULL;
}
// Now this one is safe, because we keep to the rule for
// setting pointers to NULL after deletion ...
if (myString)
{
free(myString);
myString = NULL;
}
// But what about this one:
if (yourString)
{
free(yourString);
yourString = NULL;
}
//?!? :)