ordre de tri de boost :: weak_ptr après expiration?
-
16-10-2019 - |
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?
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;