История изменений
Исправление kvpfs_2, (текущая версия) :
Я ничего не придумываю, это не функционал СТЛ, а моя логика. Один поток содержит массив с шаред_птрами, может удалять их проверив, что он владеет эксклюзивно, и если другой поток припрятал weak_ptr
и конструирует из него shared в промежутке между проверкой на уникальность и удалением из массива, то имеем утекший объект. Не в смысле там памяти, а ушедший из под надзора своего менеджера.
В общем-то до меня дошло как удалить корректно (без вероятности утечек):
vector<shared_ptr> v{...};
// try to delete back element
weak_ptr w = v.back();
v.pop_back()
if (! w.expired()) {
v.push_back(shared_ptr(w);
return false; // error, not deleted, busy
}
return true; // ok
Так что сама задача уже и неактуальна. Да и вопрос то о другом был - о каких-то разных правилах в случае конструктора и оператора=, о которых я, видимо, не знаю.
Исходная версия kvpfs_2, :
Я ничего не придумываю, это не функционал СТЛ, а моя логика. Один поток содержит массив с шаред_птрами, может удалять их проверив, что он владеет эксклюзивно, и если другой поток припрятал weak_ptr
и конструирует из него shared в промежутке между проверкой на уникальность и удалением из массива, то имеем утекший объект. Не в смысле там памяти, а ушедший из под надзора своего менеджера.
В общем-то до меня дошло как удалить корректно (без вероятности утечек):
vector<shared_ptr> v{...};
// try to delete back element
weak_ptr w = v.back();
v.pop_back()
if (! w.expired())
v.push_back(shared_ptr(w);
Так что сама задача уже и неактуальна. Да и вопрос то о другом был - о каких-то разных правилах в случае конструктора и оператора=, о которых я, видимо, не знаю.