LINUX.ORG.RU

История изменений

Исправление 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);

Так что сама задача уже и неактуальна. Да и вопрос то о другом был - о каких-то разных правилах в случае конструктора и оператора=, о которых я, видимо, не знаю.