Для большинства приложений это просто не будет иметь значения. Просто напишите свой код, в блаженном неведении о том, как точно + работы оператора, и только берут дело в свои руки, если это становится очевидным узким местом.
Это полезно, когда вы хотите поделиться членом класса, а экземпляр класса уже является shared_ptr, как показано ниже:
struct A
{
int *B; // managed inside A
};
shared_ptr<A> a( new A );
shared_ptr<int> b( a, a->B );
они разделяют счетчик использования и прочее. Это оптимизация для использования памяти.
Чтобы расширить ответы leiz и piotr , это описание shared_ptr <>
'aliasing' взято из статьи WG21 , «Улучшение shared_ptr
для C ++ 0x, версия 2» :
III. Поддержка псевдонимов
Опытным пользователям часто требуется возможность создать
shared_ptr
экземплярp
, который разделяет собственность с другой (главный)shared_ptr
q
, но указывает на объект, не являющийся базой из* q
.* p
может быть членом или элемент* q
, например. Эта раздел предлагает дополнительные конструктор, который можно использовать для этого цель.Интересный побочный эффект этого увеличение выразительной силы в том, что теперь функции
* _ pointer_cast
могут быть реализовано в пользовательском коде. Вmake_shared
Заводская функция представлена далее в этом документе также может быть реализовано с использованием только публичных интерфейсshared_ptr
через конструктор псевдонимов.Воздействие:
Эта функция расширяет интерфейс
shared_ptr
в обратно совместимом способ, который увеличивает его выразительность мощность и поэтому сильно рекомендуется добавить в C ++ 0x стандарт. Он не вводит источник и проблемы двоичной совместимости.Предлагаемый текст:
Добавить в
shared_ptr
[util.smartptr.shared] следующие конструктор:шаблон <класс Y> shared_ptr (shared_ptr
const & r, T * p); Добавить в [util.smartptr.shared.const]:
шаблон <класс Y> shared_ptr (shared_ptr
const & r, T * p); Эффекты: Создает экземпляр
shared_ptr
, который хранитp
, а разделяет владение сr
.Постусловия:
get () == p && use_count () == r.use_count ()
.Выдает: ничего.
[Примечание: Чтобы избежать возможности появления висячего указателя, пользователь этого конструктора должен гарантировать, что
p
остается действительным как минимум до тех пор, пока группа владенияр
не будет уничтожена. - примечание в конце.][Примечание: Этот конструктор позволяет создать пустой
shared_ptr
экземпляр с сохраненным указателем, отличным от NULL. - конец сообщения.]
У вас может быть указатель на какой-либо драйвер или структуру данных api нижнего уровня, которая может выделять дополнительные данные с помощью своего api нижнего уровня или другими способами. В этом случае может быть интересно увеличить use_count, но вернуть дополнительные данные, если первый указатель владеет другими указателями данных.
Вы также можете использовать это для сохранения динамических приведенных указателей, например: [
class A {};
class B: public A {};
shared_ptr<A> a(new B);
shared_ptr<B> b(a, dynamic_cast<B*>(a.get()));