Как уже отмечали другие, вы правильно поняли относительно ваших первоначальных 3 вопросов.
Но завершающая часть вашего редактирования
Вызов reset () впоток IV удалит предыдущий экземпляр класса A, созданный в первом потоке, и заменит его новым экземпляром?Более того, после вызова reset () в потоке IV другие потоки увидят только что созданный объект?
неверно.Только d
будет указывать на новый A(10)
, а a
, b
и c
будут продолжать указывать на исходный A(1)
.Это можно ясно увидеть в следующем коротком примере.
#include <memory>
#include <iostream>
using namespace std;
struct A
{
int a;
A(int a) : a(a) {}
};
int main(int argc, char **argv)
{
shared_ptr<A> a(new A(1));
shared_ptr<A> b(a), c(a), d(a);
cout << "a: " << a->a << "\tb: " << b->a
<< "\tc: " << c->a << "\td: " << d->a << endl;
d.reset(new A(10));
cout << "a: " << a->a << "\tb: " << b->a
<< "\tc: " << c->a << "\td: " << d->a << endl;
return 0;
}
(Ясно, что я не беспокоился ни о каком потоке: это не учитывает поведение shared_ptr::reset()
.)
Вывод этого кода:
a: 1 b: 1 c: 1 d: 1
a: 1 b: 1 c: 1 d: 10