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