Memória (e bloqueios de recursos) são retornados ao sistema operacional em pontos determinísticos durante a execução de um programa. O fluxo de controle de um programa por si só é suficiente para saber onde, com certeza, um determinado recurso pode ser desalocado. Assim como um programador humano sabe onde escrever fclose(file)
quando o programa termina.
Os GCs resolvem isso descobrindo isso diretamente durante o tempo de execução quando o fluxo de controle é executado. Mas a verdadeira fonte de verdade sobre o fluxo de controle é a fonte. Então, teoricamente, deve ser possível determinar onde inserir as free()
chamadas antes da compilação analisando a fonte (ou AST).
A contagem de referências é uma maneira óbvia de implementar isso, mas é fácil encontrar situações em que os ponteiros ainda são referenciados (ainda no escopo) e ainda não são mais necessários. Isso apenas converte a responsabilidade de desalocar manualmente os ponteiros em uma responsabilidade de gerenciar manualmente o escopo / referências a esses ponteiros.
Parece que é possível escrever um programa que possa ler a fonte de um programa e:
- prever todas as permutações do fluxo de controle do programa - com precisão semelhante à da execução ao vivo do programa
- acompanhar todas as referências aos recursos alocados
- para cada referência, percorra todo o fluxo de controle subsequente para encontrar o ponto mais antigo em que a referência é garantida como nunca desreferenciada
- nesse ponto, insira uma declaração de desalocação nessa linha de código-fonte
Existe alguma coisa lá fora que já faz isso? Não acho que Rust ou C ++ ponteiros inteligentes / RAII sejam a mesma coisa.