paulo1205
(usa Ubuntu)
Enviado em 09/08/2016 - 12:58h
O que o Uilianries disse está correto, mas não se aplica ao caso em questão, porque não se está falando nem de variáveis automáticas nem de variáveis estáticas, mas sim de dados na memória livre.
Eu já vi arquiteturas em que o comportamento esperado pelo autor do tópico -- alocar memória, colocar um conteúdo ali, liberá-la e, por meio de um ponteiro que ainda apontava para a área liberada, fazer acesso ao conteúdo oficialmente liberado e ainda encontrá-lo ali -- realmente acontecia.
O problema é que não existe nenhuma garantia de o que vai acontecer quando se acede a um endereço de memória depois que aquela região de memória é devolvida. A coisa pode funcionar -- incidentalmente, é bom deixar claro -- mas também pode provocar efeitos totalmente adversos, como corromper dados ou fazer o programa abortar.
A única garantia que se tem é que tentar acesso a um endereço que não pertence -- ou, como neste caso, que não pertence mais -- ao programa é um erro de programação.
Dito isso, podemos especular uma possível explicação para o comportamento observado, diferente do comportamento esperado. Uma implementação de
free() preocupada com segurança poderia muito bem forçar a gravação de conteúdo zerado na memória que está sendo liberada, para garantir que o conteúdo anterior não seja passível de exame por outros programas que possam, posteriormente, vir a alocar a mesma região de memória. Uma implementação que tome esse cuidado pode ser menos eficiente do que outra que simplesmente devolva a memória ao SO, já que gasta tempo limpando o conteúdo anterior, mas é uma implementação completamente válida e conforme o padrão que rege a biblioteca padrão do C.