Память (и блокировки ресурсов) возвращаются в ОС в детерминированных точках во время выполнения программы. Поток управления программой сам по себе достаточен, чтобы знать, где, без сомнения, данный ресурс может быть освобожден. Точно так же, как человек-программист знает, куда писать, fclose(file)
когда программа завершает работу с ним.
GC решают эту проблему, выясняя это непосредственно во время выполнения, когда выполняется поток управления. Но реальным источником правды о потоке управления является источник. Таким образом, теоретически, должно быть возможно определить, куда вставить free()
вызовы перед компиляцией, анализируя источник (или AST).
Подсчет ссылок является очевидным способом реализации этого, но легко встретить ситуации, когда на указатели все еще ссылаются (все еще в области), но больше не нужны. Это просто превращает ответственность за ручное освобождение указателей в обязанность вручную управлять областью действия / ссылками на эти указатели.
Кажется, что можно написать программу, которая может читать исходный код программы и:
- предсказывать все перестановки потока управления программой - с такой же точностью, как наблюдение за выполнением программы в реальном времени
- отслеживать все ссылки на выделенные ресурсы
- для каждой ссылки просмотрите весь последующий поток управления, чтобы найти самую раннюю точку, на которую ссылка никогда не будет разыменована
- в этот момент вставьте оператор освобождения в этой строке исходного кода
Есть ли что-нибудь, что уже делает это? Я не думаю, что интеллектуальные указатели Rust или C ++ / RAII - это одно и то же.