Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

weak_ptr

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

weak_ptr class template

Введение
Синопсис
Члены
Свободные функции
Часто задаваемые вопросы

Introduction

Шаблон классаweak_ptrхранит «слабую ссылку» на объект, который уже управляетсяshared_ptr. Для доступа к объектуweak_ptrможет быть преобразован вshared_ptrс использованиемshared_ptrконструктораили функции членазамка. Когда последнийshared_ptrк объекту уходит и объект удаляется, попытка получитьshared_ptrизweak_ptrэкземпляров, которые относятся к удаленному объекту, потерпит неудачу: конструктор бросит исключение типаboost::bad_weak_ptr, аweak_ptr::lockвернетпустойshared_ptr.

Каждыйweak_ptrсоответствуетCopyConstructibleиAssignableтребованиям стандартной библиотеки C++, и поэтому может использоваться в стандартных библиотечных контейнерах. Операторы сравнения поставляются таким образом, чтобыweak_ptrработал с ассоциативными контейнерами стандартной библиотеки.

слабые_ptrоперации никогда не бросают   исключения.

Шаблон класса параметризован наТ, тип объекта, на который указывается.

По сравнению сshared_ptr,weak_ptrобеспечивает очень ограниченное подмножество операций, поскольку доступ к его сохраненному указателю часто опасен в многопоточных программах, а иногда небезопасен даже в пределах одного потока (то есть он может вызывать неопределенное поведение). Притворитесь на мгновение, чтоweak_ptrимеетфункцию, которая возвращает необработанный указатель, и рассмотрите этот невинный фрагмент кода:

shared_ptr<int> p(new int(5));
weak_ptr<int> q(p);
// some time later
if(int * r = q.get())
{
    // use *r
}

Представьте себе, что после, если, но непосредственно передrиспользуется другой поток выполняет утверждение<p.reset()>.r— висящий указатель.

Решение этой проблемы заключается в создании временногоshared_ptrизq:

shared_ptr<int> p(new int(5));
weak_ptr<int> q(p);
// some time later
if(shared_ptr<int> r = q.lock())
{
    // use *r
}

Теперьrсодержит ссылку на объект, на который указывалq. Даже если<p.reset()>выполнен в другой нити, объект будет оставаться в живых до тех пор, покаrне выйдет из области действия или не будет сброшен. Получивshared_ptrк объекту, мы фактически заблокировали его от разрушения.

Synopsis

namespace boost {
  template<class T> class weak_ptr {
    public:
      typedef T element_type;
      weak_ptr();
      template<class Y> weak_ptr(shared_ptr<Y> const & r);
      weak_ptr(weak_ptr const & r);
      template<class Y> weak_ptr(weak_ptr<Y> const & r);
      ~weak_ptr();
      weak_ptr & operator=(weak_ptr const & r);
      template<class Y> weak_ptr & operator=(weak_ptr<Y> const & r);
      template<class Y> weak_ptr & operator=(shared_ptr<Y> const & r);
      long use_count() const;
      bool expired() const;
      shared_ptr<T> lock() const;
      void reset();
      void swap(weak_ptr<T> & b);
  };
  template<class T, class U>
    bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b);
  template<class T>
    void swap(weak_ptr<T> & a, weak_ptr<T> & b);
}

Members

element_type

typedef T element_type;

Предоставляет тип шаблонного параметра T.

constructors

weak_ptr();

Эффекты:Построениепустогослабого.

Постусловия:<use_count() == 0>.

Бросает:ничего.

template<class Y> weak_ptr(shared_ptr<Y> const & r);
weak_ptr(weak_ptr const & r);
template<class Y> weak_ptr(weak_ptr<Y> const & r);

Эффекты:Еслиrявляетсяпустым, конструируетпустымслабым_ptr; в противном случае конструируетслабым_ptr, которыйразделяет право собственностисr, как если бы хранил копию указателя, хранящегося вr.

Постусловия:<use_count() == r.use_count()>.

Бросает:ничего.

destructor

~weak_ptr();

Эффекты:Уничтожает этотслабый_ptr, но не оказывает влияния на объект, на который указывает его хранимый указатель.

Бросает:ничего.

assignment

weak_ptr & operator=(weak_ptr const & r);
template<class Y> weak_ptr & operator=(weak_ptr<Y> const & r);
template<class Y> weak_ptr & operator=(shared_ptr<Y> const & r);

Эффекты:Эквивалентно<weak_ptr(r).swap(*this)>.

Бросает:ничего.

Примечания:Реализация свободна для удовлетворения последствий (и подразумеваемых гарантий) с помощью различных средств, без создания временного.

use_count

long use_count() const;

Возврат:0, если*этопуст; в противном случае, числоshared_ptrобъектов, которыедолевого владенияс*это.

Бросает:ничего.

Примечание:<use_count()>необязательно является эффективным. Используйте только для отладки и тестирования, а не для производственного кода.

expired

bool expired() const;

Возвращение:<use_count() == 0>.

Бросает:ничего.

Примечание:<expired()>может быть быстрее<use_count()>.

lock

shared_ptr<T> lock() const;

Возвращение:<expired()? shared_ptr<T>(): shared_ptr<T>(*this)>.

Бросает:ничего.

reset

void reset();

Эффекты:эквивалентно<weak_ptr().swap(*this)>.

swap

void swap(weak_ptr & b);

Эффекты:Обменяется содержанием двух умных указателей.

Бросает:ничего.

Free Functions

comparison

template<class T, class U>
  bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b);

Возврат:неопределенное значение, такое, что

  • operator< is a strict weak ordering as described in section 25.3 [lib.alg.sorting] of the C++ standard;
  • under the equivalence relation defined by operator<, !(a < b) && !(b < a), two weak_ptr instances are equivalent if and only if they share ownership or are both empty.

Бросает:ничего.

Примечания:Позволяет использовать в качестве ключей в ассоциативных контейнерахweak_ptrобъекты.

swap

template<class T>
  void swap(weak_ptr<T> & a, weak_ptr<T> & b)

Эффекты:эквивалентно<a.swap(b)>.

Бросает:ничего.

Примечания:Соответствует интерфейсуstd::swap. Предоставляется в качестве помощи для общего программирования.

Frequently Asked Questions

Q.Может ли объект создать для себяслабый_ptrв своем конструкторе?

A.No. Aweak_ptrможет быть создан только изshared_ptr, и в момент строительства объекта еще не существуетshared_ptrдля объекта. Даже если бы вы могли создать временныйshared_ptrкэтому, он вышел бы из области действия в конце конструктора, и всеслабые_ptrэкземпляры мгновенно истекли бы.

Решение состоит в том, чтобы сделать конструктор частным и предоставить заводскую функцию, которая возвращаетshared_ptr:

class X
{
private:
    X();
public:
    static shared_ptr<X> create()
    {
        shared_ptr<X> px(new X);
        // create weak pointers from px here
        return px;
    }
};

$Date$

Авторское право 1999 Грег Колвин и Беман Доуз. Авторское право 2002 Дарин Адлер. Авторское право 2002-2005 годы Питер Димов. Распространяется под лицензией Boost Software License, версия 1.0. См. сопроводительный файлLICENSE_1_0.txtили копию наhttp://www.boost.org/LICENSE_1_0.txt

Статья weak_ptr раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 16:01:44/0.0046920776367188/0