В языках, которые позволяют явно освобождать объекты, ссылка на освобожденный объект может самопроизвольно стать, казалось бы, действительной ссылкой на не связанный объект.Например, в C, заданном:
FILE *f = fopen("file1", "w");
...
fclose(f);
FILE *g = fopen("file2", "w");
...
fprintf(f,"Hey there!");
, возможно, что к моменту выполнения fprintf FILE
, обозначенный f
, будет переработан для использования с file2
.В целом, для языка не существует дешевого способа защиты от таких ошибок.
Одним из основных преимуществ GC на основе достижимости является то, что такая вещь просто не может произойти .Если выполняется:
someStreamType f = openStreamSomewhow(...);
f.Dispose();
someStreamType g = openStreamSomewhow(...);
f.outputData(...);
, то во время вызова outputData
f
будет содержать ссылку на удаленный объект потока.Пока любая копия этой ссылки существует где-либо в юниверсе, она будет продолжать идентифицировать тот же мертвый объект.
Ни Java, ни .NET не могут безопасно перерабатывать хранилище, используемое объектом, если они не могут быть уверены, чтоникаких ссылок на него не существует.Делать такое определение для большого количества объектов одновременно намного дешевле, чем делать это для отдельных объектов, поэтому, если вам скажут, что, вероятно, никаких ссылок на какой-то конкретный объект не будет, это не очень поможет.