Что shared_ptr повышения (shared_ptr <Y> константа и r, T * p) используемый для?

Для большинства приложений это просто не будет иметь значения. Просто напишите свой код, в блаженном неведении о том, как точно + работы оператора, и только берут дело в свои руки, если это становится очевидным узким местом.

26
задан Evan Teran 10 September 2009 в 05:06
поделиться

4 ответа

Это полезно, когда вы хотите поделиться членом класса, а экземпляр класса уже является shared_ptr, как показано ниже:

struct A
{
  int *B; // managed inside A
};

shared_ptr<A>   a( new A );
shared_ptr<int> b( a, a->B );

они разделяют счетчик использования и прочее. Это оптимизация для использования памяти.

29
ответ дан 28 November 2019 в 07:20
поделиться

Чтобы расширить ответы 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. - конец сообщения.]

8
ответ дан 28 November 2019 в 07:20
поделиться

У вас может быть указатель на какой-либо драйвер или структуру данных api нижнего уровня, которая может выделять дополнительные данные с помощью своего api нижнего уровня или другими способами. В этом случае может быть интересно увеличить use_count, но вернуть дополнительные данные, если первый указатель владеет другими указателями данных.

2
ответ дан 28 November 2019 в 07:20
поделиться

Вы также можете использовать это для сохранения динамических приведенных указателей, например: [

class A {};
class B: public A {};

shared_ptr<A> a(new B);
shared_ptr<B> b(a, dynamic_cast<B*>(a.get()));
4
ответ дан 28 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: