Интересно, как слабые ссылки работают внутри, например, в .NET или на Java. Мои две общие идеи:
- "Intrusive" - добавить список слабых ссылок на самый верхний класс (класс объекта). Затем, когда объект уничтожен, все слабые ссылки могут быть итерированы и установлены в нуль.
- "Неинтрузивный" - поддерживать хэш-таблицу указателей объектов на списки слабых ссылок. Когда слабая ссылка A создается для объекта B, в хэш-таблице будет изменена или создана запись, ключ которой будет указателем на B.
- "Грязный" - для хранения специального хэш-значения с каждым объектом, который будет обнулен при уничтожении объекта. Слабые ссылки скопировали бы это хэш-значение и сравнили бы его с значением объекта, чтобы проверить, жив ли объект. Это, тем не менее, приведет к ошибкам нарушения прав доступа при непосредственном использовании, поэтому, я думаю, для этого должен быть дополнительный объект с этим значением хэша.
Любое из этих решений кажется чистым и эффективным. Кто-нибудь знает, как это делается?