порядок сортировки boost :: weak_ptr после истечения срока действия? - PullRequest
5 голосов
/ 21 января 2011

Для boost::weak_ptr определено operator<, чтобы его можно было использовать в ассоциативных контейнерах.

Мой вопрос таков: стабилен ли порядок сортировки нескольких weak_ptr объектов, даже если некоторые из них меняются на нулевой счет? Разве это не портит контейнеры типа std::set?

Пример:

using namespace boost;
shared_ptr<A> sptrA1(new A);
weak_ptr<A> wptrA1 = sptrA1;
weak_ptr<A> wptrA2;

{ // begin Scope 1
    shared_ptr<A> sptrA2(new A);
    wptrA2 = sptrA2;
    assert(wptrA1 < wptrA2); // assert #1
}
assert(wptrA1 < wptrA2); // assert #2
  • Будет ли утверждение № 2 всегда верным, если утверждение № 1 истинно?
  • Находится ли wptrA2 в одном и том же состоянии до и после Прицела 1?

Ответы [ 3 ]

5 голосов
/ 21 января 2011

В текущей реализации boost::weak_ptr, operator< сравнивает указатель с внутренней структурой отслеживания подсчета ссылок. Эта структура не освобождается до тех пор, пока не будут удалены все сильные и слабые ссылки, поэтому безопасным будет использование operator<, даже если данные, на которые указывают пользователи, были освобождены из-за отсутствия сильных ссылок.

2 голосов
/ 21 января 2011

Читайте о слабом сравнении здесь .

1 голос
/ 20 мая 2011

Используйте std :: owner_less.Это сравнивает указатель количества использования, а не сам указатель.Например:

typedef std::weak_ptr<int> IntWPtr;
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set;
...