Дозвольте мені повторити ваше запитання: "Моє запитання, як циклічна структура даних робить кількість посилань вище нуля, просимо показати на прикладі в програмі C ++. Як проблема вирішується ще weak_ptrs
раз на прикладі, будь ласка."
Проблема виникає з таким кодом на C ++ (концептуально):
class A { shared_ptr<B> b; ... };
class B { shared_ptr<A> a; ... };
shared_ptr<A> x(new A);
x->b = new B;
x->b->a = x;
Відповісти на другу частину Вашого запитання: Математично неможливо мати справу з циклами підрахунку посилань. Отже, a weak_ptr
(який є в основному лише видаленою версією shared_ptr
) не може бути використаний для вирішення проблеми циклу - програміст вирішує проблему циклу.
Щоб її вирішити, програміст повинен знати про відносини власності між об’єктами або повинен винайти відносини власності, якщо таких форм власності природно не існує.
Наведений вище код C ++ можна змінити так, щоб A володів B:
class A { shared_ptr<B> b; ... };
class B { weak_ptr<A> a; ... };
shared_ptr<A> x(new A);
x->b = new B;
x->b->a = x;
Найважливіше питання: чи weak_ptr
можна використовувати, якщо програміст не може визначити відносини власності та не може встановити будь-яке статичне право власності через відсутність привілеїв чи відсутність інформації?
Відповідь така: якщо право власності на об’єкти незрозуміле, weak_ptr
це не може допомогти. Якщо є цикл, програміст повинен його знайти і розірвати. Альтернативним засобом є використання мови програмування з повним збиранням сміття (наприклад: Java, C #, Go, Haskell) або використання консервативного (= недосконалого) збирача сміття, який працює з C / C ++ (наприклад: Boehm GC) .