Question

Pour boost::weak_ptr le operator< est défini, de sorte qu'il peut être utilisé dans des conteneurs associatifs.

Ma question est: l'ordre de tri de plusieurs objets weak_ptr stables même si certains d'entre eux à un changement refcount de zéro? Ça ne plaisante pas avec des conteneurs comme std::set?

Exemple:

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
  • affirmeront # 2 tenir toujours vrai si assert # 1 est vrai?
  • est wptrA2 dans le même état avant et après la portée 1?
Était-ce utile?

La solution

Dans la mise en œuvre actuelle du boost::weak_ptr, operator< compare un pointeur sur une structure de suivi de comptage référence interne. Cette structure n'est pas libéré jusqu'à ce que tous forts et faible références sont supprimées, il reste operator< sûr à l'utilisation même si les données pointé à l'utilisateur a été libéré en raison d'un manque de références solides.

Autres conseils

Lisez à propos weak_ptr comparision ici .

Utilisez std :: owner_less. Cela se compare le pointeur du compteur d'utilisation, pas le pointeur lui-même. Par exemple:

typedef std::weak_ptr<int> IntWPtr;
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top