Я оценивал различные реализации интеллектуальных указателей (вау, там много), и мне кажется, что большинство из них можно разделить на две широкие классификации:
1) В этой категории используется наследование объектов, на которые имеются ссылки, так что они имеют счетчики ссылок и обычно реализуются up () и down () (или их эквивалентами). IE, чтобы использовать умный указатель, объекты, на которые вы указываете, должны наследоваться от некоторого класса, который предоставляет реализация ref.
2) В этой категории используется вторичный объект для хранения счетчиков ссылок. Например, вместо того, чтобы указывать умный указатель прямо на объект, он фактически указывает на этот объект метаданных ... У кого есть реализация счетчиков ссылок и up () и down () (и кто обычно предоставляет механизм для указателя на получить фактический объект, на который указывает указатель, чтобы умный указатель мог правильно реализовать оператор -> ()).
Теперь у 1 есть недостаток, заключающийся в том, что он заставляет все объекты, на которые вы хотите сосчитать ссылки, унаследовать от общего предка, и это означает, что вы не можете использовать это для ссылок на объекты подсчета, которые вы не можете контролировать исходный код до.
2 имеет проблему в том, что, поскольку счет хранится в другом объекте, если у вас когда-нибудь возникнет ситуация, когда указатель на существующий объект с подсчетом ссылок преобразуется в ссылку, у вас, вероятно, есть ошибка (IE, так как счетчик не находится в фактическом объекте, для новой ссылки нет способа получить счет ... ссылка на ссылку копирует конструкцию или назначение хорошо, потому что они могут совместно использовать объект счетчика, но если вам когда-либо придется конвертировать из указателя ты полностью отсталый) ...
Теперь, насколько я понимаю, boost :: shared_pointer использует механизм 2 или что-то вроде этого ... Тем не менее, я не могу определиться, что еще хуже! Я только когда-либо использовал механизм 1, в производственном коде ... Кто-нибудь имеет опыт работы с обоими стилями? Или, может быть, есть другой способ, который лучше, чем оба?