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?

Foi útil?

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 pelo calloc, malloc, ou função realloc, ou se o espaço foi desalocada por uma chamada para free ou realloc, 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;
}

//?!? :)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top