Se ho un std::shared_ptr<Foo>
con un deleter personalizzato, è garantito che tutti i puntatori deboli associati sono visti come scaduti dal deleter? (Lo apprezzerei molto se potessi citare sezioni rilevanti nello standard).I puntatori deboli sono garantiti per essere scaduti quando viene eseguito il deleter std :: shared_ptr?
In altre parole, l'affermazione sotto è garantita per non sparare?
std::weak_ptr<Foo> weak;
std::shared_ptr<Foo> strong{
new Foo,
[&weak] (Foo* f) {
assert(weak.expired());
delete f;
},
};
weak = strong;
strong.reset();
Bene, il contatore di utilizzo sarà zero prima che venga chiamato il deleter e [questo riferimento 'scaduto'] (http://en.cppreference.com/w/cpp/memory/weak_ptr/expired) dice che è" Equivalente a 'use_count() == 0'". Il riferimento non è autorevole, è necessario passare attraverso le specifiche per trovare la risposta definitiva (bozze degli standard C++ 11, C++ 14 e C++ 17 sono tutte disponibili gratuitamente, l'ultima bozza prima della ratifica è buona abbastanza). –
concordato. Ma una risposta definitiva dallo standard è esattamente quello che sto chiedendo. :-) Non ne ho ancora trovato uno per me stesso. – jacobsa
Penso che questo sia implicito: se la tua asserzione non fosse vera, allora potresti sostituirla con 'weak.lock()' (e magari spostare la proprietà), e quindi il distruttore per l'oggetto condiviso verrebbe eseguito due volte. –