WeakReference «отпустила» объектВ .NET слабые ссылки позволяют ссылаться на объект, не препятствуя сборщику мусора его удалить. Это полезно в кэшах, пулах объектов и других случаях, где важно избегать утечек памяти.
Но как проверить, что объект удаляется?
Можно использовать пример:
class MyObject
{
~MyObject()
{
Console.WriteLine("MyObject был удалён сборщиком мусора");
}
}
class Program
{
static void Main()
{
WeakReference weakRef = test();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Console.WriteLine("После сборки мусора: " + (weakRef.IsAlive ? "Жив" : "Удалён"));
}
static WeakReference test() {
var obj = new MyObject();
WeakReference weakRef = new WeakReference(obj);
Console.WriteLine("До удаления ссылки: " + (weakRef.IsAlive ? "Жив" : "Удалён"));
return weakRef;
}
}
•
IsAlive показывает, жив ли объект.•
GC.Collect() + GC.WaitForPendingFinalizers() заставляют сборщик мусора немедленно освободить неиспользуемые объекты.• Деструктор
~MyObject() позволяет наглядно убедиться, что объект удалён.Метод
IsAlive может показывать, что объект жив даже после GC.Collect(), если объект ещё не финализирован или находится в очереди на финализацию.Для надёжности можно использовать
TryGetTarget вместо IsAlive.🐸Библиотека шарписта #буст
