Является ли shared_ptr, p вызывающим деструктором, когда он выходит из области видимости или сбрасывается (в nullptr)?
Да, точно.
Как p справляется с утечкой памяти из-за того, что A :: a?
p
не думает, что ему принадлежит объект, поэтому он удаляет его.Там нет утечки.Но a
также думает, что ему тоже принадлежит объект, поэтому он пытается удалить его во второй раз и вылетает.
Я понимаю, что умные указатели обычно обрабатывают новые объекты, и это, вероятно, случай, который не часто используется, но я хочу попытаться изучить это.
Это случайне используется вообще, потому что вы не можете иметь несколько объектов, владеющих одной и той же памятью одновременно, именно по этой причине.
Правильным решением является либо class A
использовать shared_ptr
внутри:
class A {
private:
shared_ptr<B> b;
public:
A() { b.reset(new B); }
shared_ptr<B> get() { return b; }
};
int main(int argc, const char * argv[]) {
A a;
shared_ptr<B> p = a.get();
cout << p->hello() << endl;
p.reset();
return 0;
}
Или просто не берите в собственность необработанный указатель, для которого вы сами не назначали:
int main(int argc, const char * argv[]) {
A a;
B *p = a.get();
cout << p->hello() << endl;
return 0;
}
Весь смысл использования умных указателей в том, чтобы быть явно о том, кто чем владеет и как передается право собственности.Ваш пример нарушает это.