Я понимаю основную концепцию сборки мусора, о том, что если у определенного объекта c больше нет указателей, ссылающихся на него, он становится "сборщиком мусора".
Почти. Суть в том, что объект не собирается сразу после последней ссылки на этот объект. После того, как этот объект находится в состоянии ожидания и ожидает запуска процесса сбора мусора.
Означает ли это, что он освобожден, но его значение все еще доступно для чтения с помощью отладчика / дизассемблера (по крайней мере, пока этот адрес не будет записан)?
Да. Как я упоминал выше, освобожденные объекты все еще находятся в памяти и ждут запуска G C. Поскольку сборщик мусора не определен c, вы не знаете точно, когда сборщик мусора выполняет свою работу. Более того, вы все равно можете получить ссылку на этот объект (с помощью метода Finalize Finalize override docs link )
Я знаю, что с большинством объектов (которые реализуют интерфейс IDisposable в C# вы Можно вызвать метод Dispose () и быть уверенным, что к памяти больше никогда не будет доступа. Но как насчет строк?
Основное использование этого интерфейса - освобождение неуправляемых ресурсов Сборщик мусора автоматически освобождает память, выделенную для управляемого объекта, когда этот объект больше не используется. Используйте метод Dispose этого интерфейса для явного освобождения неуправляемых ресурсов вместе с сборщиком мусора. Утилизация управляемого Объект не означает, что этот объект является выпусками. Утилизируйте, измените только внутреннее состояние этого объекта (например, он освобождает исходную ссылку на растровое изображение), но объект остается тем же - он потребляет память, он все еще может использоваться, вы можете вызвать его методы, et c. Только G * 10 35 * удаляет объект из памяти. Таким образом, поскольку строка является управляемым объектом, она освобождается G C.
Как вы гарантируете (надеюсь, из кодовых / модульных тестов), что строка никогда не будет снова ссылаться из памяти ( даже от злонамеренного стороннего производителя).
IMO, решение состоит в том, чтобы реализовать свой собственный упаковщик строк с функцией, подобной dispose - например, после использования экземпляра этого класса оболочки и больше не требуется, вы можете вызвать метод Free (), и ваша реализация перезапишет значение базовой строки в памяти (в безопасном или небезопасном контексте). Но это требует точного управления ресурсами. Кроме того, перезапись строки должна вызываться методом Finalize () для обеспечения обнуления памяти после того, как объект был G C -ed.